NSURLSession dataTaskWithRequest完成块是否始终在主线程上运行?

奇雷克·贝克贝克

在我看来,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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在主线程上运行NSURLSession完成处理程序

来自分类Dev

未调用NSURLSession完成块

来自分类Dev

NSURLSession dataTaskWithRequest迅捷

来自分类Dev

NSURLSession的dataTaskWithRequest:返回nil

来自分类Dev

函数在NSURLSession之前完成-dataTaskWithRequest完成

来自分类Dev

NSURLSession performSegueWithIdentifier未运行

来自分类Dev

NSURLSession performSegueWithIdentifier未运行

来自分类Dev

NSURLSession dataTaskWithRequest没有被调用

来自分类Dev

完成NSURLSession后获取NSData

来自分类Dev

跟踪何时完成多个NSURLSession

来自分类Dev

完成NSURLSession后获取NSData

来自分类Dev

NSURLConnection sendAsynchronousRequest完成块是否在主线程上执行?

来自分类Dev

NSURLSession是否持续存在?

来自分类Dev

NSURLSession在Android中是否等效?

来自分类Dev

NSURLSession是否在单独的线程中发生?

来自分类Dev

从 NSUrlSession 调用时 CoreData 主线程 UI 警告

来自分类Dev

确保在主线程上执行完成块

来自分类Dev

递归/循环NSURLSession异步完成处理程序

来自分类Dev

NSURLSession委托和完成处理程序

来自分类Dev

NSURLSession线程:跟踪多个后台下载

来自分类Dev

iOS多线程-NSURLSession和UI更新

来自分类Dev

NSURLSession线程:跟踪多个后台下载

来自分类Dev

来自多个NSURLSession的NSURLSessionTasks的线程行为?

来自分类Dev

NSURLSession是否自动发送用户代理

来自分类Dev

NSUrlSession是否阻止应用程序挂起?

来自分类Dev

NSURLSession在iOS 7.0.x上挂起

来自分类Dev

在iOS10上恢复NSUrlSession

来自分类Dev

Swift NSURLSession App在蜂窝数据上崩溃

来自分类Dev

RestKit完成块是否在主UI线程上运行?