Ios 在另一个块中返回一个块有时会延迟
我正在尝试从Ios 在另一个块中返回一个块有时会延迟,ios,json,swift,closures,nsurlsession,Ios,Json,Swift,Closures,Nsurlsession,我正在尝试从NSURLConnection迁移到nsursession。我以前在NSURLConnection中使用过委托方法返回JSON对象。但现在我希望实现块来返回JSON对象。我有自己的块来返回JSON对象,因为我在一个单独的类中有NSURLSessionNetwork a活动,该类对所有服务调用都是通用的。我使用了它的委托方法,一切都很好,但是当我使用它的内置块获取对象并使用我自己的块返回它时,事情就变得一团糟了 我在网上搜索过,发现有人使用GCD获取主队列并调用返回块。我也试过了,但有
NSURLConnection
迁移到nsursession
。我以前在NSURLConnection
中使用过委托方法返回JSON对象。但现在我希望实现块来返回JSON对象。我有自己的块来返回JSON对象,因为我在一个单独的类中有NSURLSession
Network a活动,该类对所有服务调用都是通用的。我使用了它的委托方法,一切都很好,但是当我使用它的内置块获取对象并使用我自己的块返回它时,事情就变得一团糟了
我在网上搜索过,发现有人使用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()
finishtasks和invalidate()。一旦调用完成处理程序,任务将被标记为已完成,您不必担心它。finishtasks和invalidate()。一旦调用完成处理程序,任务将被标记为完成,您无需担心。为什么要调用finishtasks和invalidate()
?finishtasks和invalidate()
方法使会话无效。对于您创建会话对象的每次调用,这就是您看到延迟的原因。我刚才在教程中读到,最好这样做,任务只有在完成时才会暂停,而不是停用。@nanjunda,但延迟不会每次都发生。我应该让任务保持打开状态吗?您为什么调用finishtasks和invalidate()
?finishtasks和invalidate()
方法使会话无效。对于您创建会话对象的每次调用,这就是您看到延迟的原因。我刚才在一篇教程中读到,最好这样做,任务只有在完成时才会暂停,而不是停用。@nanjunda,但延迟不会每次都发生。我应该让任务保持打开状态吗?这是因为我使用了NSURLsession。直接使用sharedSession()?我必须调整GCD以提高效率还是保持原样?是的,因为我们直接使用它。若您的完成块在主线程中被调用,那个么您可以删除GCD块,即使它存在,也不会对您造成伤害:)这是因为我使用了NSURLsession。直接使用sharedSession()?我必须调整GCD以提高效率还是保持原样?是的,因为我们直接使用它。若在主线程中调用了完成块,则可以删除GCD块,即使它存在,也不会对您造成伤害:)