dataTaskWithRequest方法在哪里使用?

时间:2016-11-02 18:47:01

标签: swift nsurlsession

public func dataTaskWithRequest(request: NSURLRequest, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void) -> NSURLSessionDataTask

我知道上面的使用方法。

public func dataTaskWithRequest(request: NSURLRequest) -> NSURLSessionDataTask 

但这种方法的用途是什么?我对它是如何使用感到困惑。我看到的所有例子都使用第一种方法。该方法不返回数据,没有错误处理,也没有任何响应?或者你是否以某种方式将此信封作为一项任务,然后在队列中运行?

2 个答案:

答案 0 :(得分:2)

如果您为自定义NSURLSession指定了委托,则可以使用后一种方法。数据不会返回到闭包,而是会话调用您的代理人didReceiveData,您必须单独实施。NSURLSession

实现委托方法需要做更多的工作,所以你通常只在你绝对需要的地方这样做(例如你想要处理数据而不是等待所有数据进入;你需要委托方法来自定义处理重定向和挑战;您正在使用下载或上传任务而不是数据任务来执行后台NSURLSessionDelegate;等等。

例如,要发出一个简单的GET请求,期望JSON响应,您可以定义您的类以符合URLSessionDelegateURLSessionDataDelegate,以及可选的URLSessionTaskDelegate(称为{{分别在Objective-C和Swift 2中使用1}},NSURLSessionDataDelegateNSURLSessionTaskDelegate,然后在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)")
    }
}

显然,除非你需要一些更复杂的委托方法,否则你不会这样做,但我想展示一个极简主义的实现(这有助于我们理解完成处理程序的再现)。

答案 1 :(得分:1)

public func dataTaskWithRequest(request: NSURLRequest, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void) -> NSURLSessionDataTask

直接在完成处理程序中返回dataresponseerror

public func dataTaskWithRequest(request: NSURLRequest) -> NSURLSessionDataTask 

URLSessionDataDelegate协议一起使用。需要实施几种方法。在几个阶段中,调用委托方法来处理数据。

协议方法可以更好地控制加载过程,例如处理凭证请求和重定向控制。