在我看来,iOS8.4似乎有一些变化。我的完成块NSURLSession
dataTaskWithRequest
在主线程上运行,而不是在执行简历的线程上运行。这是新的和/或正确的行为吗?
有很多贴子像这样,用户想获得在主线程中完成的代码,但我现在发现它的存在已经(打破我的代码)。这是一个隔离的示例:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
self.threadTest()
}
return true
}
func threadTest() {
println("threadTest on Main Thread: \(NSThread.currentThread().isMainThread)")
let urlString = "http://www.apple.com/contact/"
let url = NSURL(string:urlString)
var request = NSMutableURLRequest(URL: url!)
var configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
var session = NSURLSession(configuration: configuration, delegate:nil, delegateQueue:NSOperationQueue.mainQueue())
var task = session.dataTaskWithRequest(request) {
(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
if error != nil {
print("Error: \(error.localizedDescription)")
}
else {
if let result = NSString(data: data, encoding:NSASCIIStringEncoding) {
let partial = result.substringToIndex(10)
println("Retrieved Page: \(partial)...")
println("NSURLSession.dataTashWithRequest completion block on Main Thread: \(NSThread.currentThread().isMainThread)")
}
}
}
task.resume()
}
结果:
主线程上的threadTest:false检索页面:
<!DOCTYPE ...
主线程上的NSURLSession.dataTashWithRequest完成块:true
我只是想出了答案。完成处理程序的线程是在NSURLSession的init中设置的。
从文档:
init(configuration configuration: NSURLSessionConfiguration, delegate delegate: NSURLSessionDelegate?, delegateQueue queue: NSOperationQueue?)
队列-用于调度委托调用和完成处理程序的队列。如果为nil,则会话将创建一个串行操作队列,以执行所有委托方法调用和完成处理程序调用。
我的代码设置为在主线程上完成:
var session = NSURLSession(configuration: configuration, delegate:nil, delegateQueue:NSOperationQueue.mainQueue())
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句