返回另一个块内的块有时会延迟

Returning a block inside another block sometimes delayed

我正在尝试从 NSURLConnection 迁移到 NSURLSession。我以前使用委托方法 return JSON 对象 IN NSURLConnection。但是现在我正在寻找 return JSON 对象的块。我有自己的 return JSON 对象块,因为我在所有服务调用共有的单独 class 中有 NSURLSession 网络活动。我已经使用它的委托方法并且一切正常,但是当我使用它的内置块来获取对象并 return 它使用我自己的块时,事情变得一团糟。

我通过网络搜索发现有人使用 GCD 获取主队列并调用 return 块。我也试过了,但有时它也会延迟。执行此操作的最佳做​​法是什么?

这是我的代码

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()

finishTasksAndInvalidate() 作用于会话而不是任务。一旦完成处理程序被调用,任务将被标记为完成,您不必担心它。