在下面的方法中,如果我在completionHandler中进行数据处理,这是否会阻塞主线程?换句话说,在completionHandler中执行的操作是在主线程上完成的,还是在后台线程上完成的?
+ (void)sendAsynchronousRequest:(NSURLRequest *)request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*)) handler NS_AVAILABLE(10_7, 5_0);发布于 2013-02-08 11:16:18
这取决于您支持的操作系统版本。根据documentation,在NSOperationQueue上执行完成处理程序块。
+(void)sendAsynchronousRequest:(NSURLRequest *)request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*)) handler NS_AVAILABLE(10_7, 5_0);向下几行进入NSOperationQueue documentation,您将看到以下引用:
操作队列通常提供用于运行其操作的线程。在OSXv10.6及更高版本中,操作队列使用libDispatch库(也称为中央分派)来启动其操作的执行。因此,操作总是在单独的线程上执行,而不管它们是被指定为并发操作还是非并发操作。然而,在OSXv10.5中,只有当isConcurrent方法返回NO时,才会在单独的线程上执行操作。如果该方法返回YES,则操作对象将创建自己的线程(或启动某个异步操作);队列不会为其提供线程。
注意:在iOS 4和更高版本中,操作队列使用中央调度来执行操作。在iOS 4之前,它们为非并发操作创建单独的线程,并从当前线程启动并发操作。有关并发和非并发操作之间的区别以及它们的执行方式的讨论,请参见NSOperation类参考。
如果您的应用程序支持OSXv10.6及更高版本,则应在单独的线程上执行完成处理程序。在OSXv10.5中,您必须指定它。对于iOS,它也使用GCD,所以操作也是在iOS 4和更高版本的单独线程上执行的。希望这比汤米的回答更清楚。
发布于 2013-02-08 07:30:17
对于每个the documentation,queue是:
处理程序块在请求完成或失败时被调度到的操作队列。
因此,handler将在那里执行。值得注意的是,对于实际的网址连接将在哪里完成,这两种方式都没有做出承诺,所以如果你想在主线程上完成,你应该只指定[NSOperationQueue mainQueue]。
https://stackoverflow.com/questions/14763050
复制相似问题