我正在尝试从NSURLSession
迁移到NSURLConnection
。我以前使用委托方法返回J NSURLConnection
的JSON对象。但是现在我想要实现块来返回JSON对象。我有自己的块来返回JSON对象,因为我在所有服务调用共有的单独类中有NSURLSession
网络活动。我使用它的委托方法,一切正常,但当我使用它的内置块来获取对象并使用我自己的块返回它时,事情变得混乱。
我在网上搜索过,发现人们使用GCD来获取主要队列并调用返回区块。我也试过了,但有时它也会延迟。这样做的最佳做法是什么?
这是我的代码
let urlString = baseURL + methodName
let postString = NSString(bytes: postData.bytes, length: postData.length, encoding: NSUTF8StringEncoding)
let request : NSMutableURLRequest = NSMutableURLRequest(URL: url)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.HTTPMethod = "POST"
request.HTTPBody = postString?.dataUsingEncoding(NSUTF8StringEncoding)
request.timeoutInterval = requestTimeOutInterval
let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
NSURLSession.sharedSession().finishTasksAndInvalidate()
do {
let responseDict: NSMutableDictionary? = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as? NSMutableDictionary
dispatch_async(dispatch_get_main_queue()) {
completionHandler(responseDict, nil, true)
}
} catch let err as NSError {
dispatch_async(dispatch_get_main_queue()) {
completionHandler(nil, nil, true)
}
}
})
task.resume()
答案 0 :(得分:0)
finishTasksAndInvalidate()
对会话而不是任务进行操作。一旦调用完成处理程序,任务将被标记为完成,您不必担心它。