在下面的方法中,如果我在completionHandler中进行数据处理,这是否会阻塞主线程?换句话说,是在主线程上完成的completionHandler中执行的任何操作,还是在后台线程上完成的?
+ (void)sendAsynchronousRequest:(NSURLRequest *)request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*)) handler NS_AVAILABLE(10_7, 5_0);
答案 0 :(得分:1)
每the documentation,queue
为:
请求完成或失败时将处理程序块分派到的操作队列。
所以handler
将在那里执行。值得注意的是,没有任何方式可以确定实际的URL连接的位置,所以如果你想在主线程上完成,你应该只指定[NSOperationQueue mainQueue]
。
答案 1 :(得分:0)
这取决于您支持的操作系统版本。根据{{3}},完成处理程序块在NSOperationQueue上执行。
+(void)sendAsynchronousRequest:(NSURLRequest *)request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*)) handler NS_AVAILABLE(10_7, 5_0);
NSOperationQueue documentation中的几行,你会看到这句话:
操作队列通常提供用于运行其操作的线程。在OS X v10.6及更高版本中,操作队列使用libdispatch库(也称为Grand Central Dispatch)来启动其操作的执行。因此,无论是将它们指定为并发还是非并发操作,操作始终在单独的线程上执行。但是,在OS X v10.5中,仅当isConcurrent方法返回NO时,才会在单独的线程上执行操作。如果该方法返回YES,则操作对象应该创建自己的线程(或者启动一些异步操作);队列没有为它提供线程。
注意:在iOS 4及更高版本中,操作队列使用Grand Central Dispatch执行操作。在iOS 4之前,它们为非并发操作创建单独的线程,并从当前线程启动并发操作。有关并发和非并发操作之间的区别及其执行方式的讨论,请参阅NSOperation类参考。
如果您的应用支持OSX v10.6及更高版本,则应在单独的线程上执行完成处理程序。在OS X v10.5中,您必须指定它。对于iOS,它也使用GCD,因此操作也在iOS 4及更高版本的不同线程上执行。希望这比汤米的回应更清楚。