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块,即使它存在,也不会对您造成伤害:)