gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 05:58:34 24 4
gpt4 key购买 nike

在我看来,iOS8.4 可能有所改变。我的 NSURLSession 的完成 block dataTaskWithRequest在主线程上运行,而不是在执行恢复的线程上运行。这是新的和/或正确的行为吗?

this这样的帖子很多用户希望在主线程上获得完成代码,但我现在发现它已经存在(破坏我的代码)。这是一个孤立的样本:

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 on Main Thread: false Retrieved Page: <!DOCTYPE ... NSURLSession.dataTashWithRequest completion block on Main Thread: true

最佳答案

我刚刚找到答案。完成处理程序的线程在 NSURLSession 的初始化中设置。

来自 documentation :

init(configuration配置:NSURLSessionConfiguration,delegate委托(delegate):NSURLSessionDelegate?,delegateQueue队列:NSOperationQueue?)

队列 - 用于安排委托(delegate)调用和完成处理程序的队列。如果为 nil, session 将创建一个串行操作队列以执行所有委托(delegate)方法调用和完成处理程序调用。

我在主线程上设置完成的代码:

var session = NSURLSession(configuration: configuration, delegate:nil, delegateQueue:NSOperationQueue.mainQueue())

关于ios - NSURLSession dataTaskWithRequest 完成 block 是否始终在主线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31476411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com