dataTaskWithRequest 方法在哪里使用?
Where is dataTaskWithRequest method used?
public func dataTaskWithRequest(request: NSURLRequest, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void) -> NSURLSessionDataTask
我知道上面的使用方法
public func dataTaskWithRequest(request: NSURLRequest) -> NSURLSessionDataTask
但是这个方法有什么用呢?我很困惑 used.All 我看到的示例是如何使用第一种方法的。方法returns没有数据,没有要处理的错误,也没有任何响应?还是您以某种方式将其作为一项任务封装起来,然后 运行 放入队列中?
如果您为自定义 NSURLSession
指定了委托,则可以使用后一种方法。数据不会返回到闭包,而是会话调用您的委托的 didReceiveData
,您必须单独实现它。
尽管如此,实现委托方法需要做更多的工作,因此您通常只在绝对必要的地方执行此操作(例如,您希望在数据传入时对其进行处理,而不是等待所有数据传入;您需要委托方法来自定义处理重定向和质询;您在后台 NSURLSession
使用下载或上传任务而不是数据任务;等等)。
例如,要发出一个简单的 GET 请求,期望得到 JSON 响应,您可以将 class 定义为符合 URLSessionDelegate
, URLSessionDataDelegate
, and, optionally, URLSessionTaskDelegate
(称为 NSURLSessionDelegate
、NSURLSessionDataDelegate
和 NSURLSessionTaskDelegate
,分别在 Objective-C 和 Swift 2) 中,然后在 Swift 3 中执行如下操作:
var responseData: Data?
func performRequest() {
let url = URL(string: "http://ip.jsontest.com/")!
var request = URLRequest(url: url)
request.setValue("application/json", forHTTPHeaderField: "Accept")
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
responseData = Data()
let task = session.dataTask(with: request)
task.resume()
}
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
responseData!.append(data)
}
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
guard error == nil else {
print(error!)
return
}
do {
guard let jsonObject = try JSONSerialization.jsonObject(with: responseData!) as? [String: AnyObject] else {
print("response was not JSON dictionary")
print("responseString: \(String(data: responseData!, encoding: .utf8))")
return
}
print(jsonObject)
} catch let parseError {
print("JSON Error: \(parseError)")
}
}
或者,在 Swift 2:
var responseData: NSMutableData?
func performRequest() {
let url = NSURL(string: "http://ip.jsontest.com/")!
let request = NSMutableURLRequest(URL: url)
request.setValue("application/json", forHTTPHeaderField: "Accept")
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
responseData = NSMutableData()
let task = session.dataTaskWithRequest(request)
task.resume()
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
responseData!.appendData(data)
}
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
guard error == nil else {
print(error!)
return
}
do {
guard let jsonObject = try NSJSONSerialization.JSONObjectWithData(responseData!, options: []) as? [String: AnyObject] else {
print("response was not JSON dictionary")
print("responseString: \(String(data: responseData!, encoding: NSUTF8StringEncoding))")
return
}
print(jsonObject)
} catch let parseError {
print("JSON Error: \(parseError)")
}
}
显然,除非您也需要一些更复杂的委托方法,否则您不会这样做,但我想展示一个极简主义的实现(这有助于我们欣赏完成处理程序的呈现)。
public func dataTaskWithRequest(request: NSURLRequest, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void) -> NSURLSessionDataTask
returns data
、response
和 error
直接在完成处理程序中。
public func dataTaskWithRequest(request: NSURLRequest) -> NSURLSessionDataTask
与 URLSessionDataDelegate
协议结合使用。需要实施几个方法。在几个阶段调用委托方法来处理数据。
协议方法提供了对加载过程的更精细控制,例如处理凭据请求和重定向控制。
public func dataTaskWithRequest(request: NSURLRequest, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void) -> NSURLSessionDataTask
我知道上面的使用方法
public func dataTaskWithRequest(request: NSURLRequest) -> NSURLSessionDataTask
但是这个方法有什么用呢?我很困惑 used.All 我看到的示例是如何使用第一种方法的。方法returns没有数据,没有要处理的错误,也没有任何响应?还是您以某种方式将其作为一项任务封装起来,然后 运行 放入队列中?
如果您为自定义 NSURLSession
指定了委托,则可以使用后一种方法。数据不会返回到闭包,而是会话调用您的委托的 didReceiveData
,您必须单独实现它。
尽管如此,实现委托方法需要做更多的工作,因此您通常只在绝对必要的地方执行此操作(例如,您希望在数据传入时对其进行处理,而不是等待所有数据传入;您需要委托方法来自定义处理重定向和质询;您在后台 NSURLSession
使用下载或上传任务而不是数据任务;等等)。
例如,要发出一个简单的 GET 请求,期望得到 JSON 响应,您可以将 class 定义为符合 URLSessionDelegate
, URLSessionDataDelegate
, and, optionally, URLSessionTaskDelegate
(称为 NSURLSessionDelegate
、NSURLSessionDataDelegate
和 NSURLSessionTaskDelegate
,分别在 Objective-C 和 Swift 2) 中,然后在 Swift 3 中执行如下操作:
var responseData: Data?
func performRequest() {
let url = URL(string: "http://ip.jsontest.com/")!
var request = URLRequest(url: url)
request.setValue("application/json", forHTTPHeaderField: "Accept")
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
responseData = Data()
let task = session.dataTask(with: request)
task.resume()
}
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
responseData!.append(data)
}
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
guard error == nil else {
print(error!)
return
}
do {
guard let jsonObject = try JSONSerialization.jsonObject(with: responseData!) as? [String: AnyObject] else {
print("response was not JSON dictionary")
print("responseString: \(String(data: responseData!, encoding: .utf8))")
return
}
print(jsonObject)
} catch let parseError {
print("JSON Error: \(parseError)")
}
}
或者,在 Swift 2:
var responseData: NSMutableData?
func performRequest() {
let url = NSURL(string: "http://ip.jsontest.com/")!
let request = NSMutableURLRequest(URL: url)
request.setValue("application/json", forHTTPHeaderField: "Accept")
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
responseData = NSMutableData()
let task = session.dataTaskWithRequest(request)
task.resume()
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
responseData!.appendData(data)
}
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
guard error == nil else {
print(error!)
return
}
do {
guard let jsonObject = try NSJSONSerialization.JSONObjectWithData(responseData!, options: []) as? [String: AnyObject] else {
print("response was not JSON dictionary")
print("responseString: \(String(data: responseData!, encoding: NSUTF8StringEncoding))")
return
}
print(jsonObject)
} catch let parseError {
print("JSON Error: \(parseError)")
}
}
显然,除非您也需要一些更复杂的委托方法,否则您不会这样做,但我想展示一个极简主义的实现(这有助于我们欣赏完成处理程序的呈现)。
public func dataTaskWithRequest(request: NSURLRequest, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void) -> NSURLSessionDataTask
returns data
、response
和 error
直接在完成处理程序中。
public func dataTaskWithRequest(request: NSURLRequest) -> NSURLSessionDataTask
与 URLSessionDataDelegate
协议结合使用。需要实施几个方法。在几个阶段调用委托方法来处理数据。
协议方法提供了对加载过程的更精细控制,例如处理凭据请求和重定向控制。