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

时间:2015-10-23 06:48:03

标签: ios json swift closures nsurlsession

我正在尝试从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()

1 个答案:

答案 0 :(得分:0)

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