首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sendAsynchronousRequest NSURLConnectionRequest

sendAsynchronousRequest NSURLConnectionRequest
EN

Stack Overflow用户
提问于 2013-02-08 07:26:18
回答 2查看 940关注 0票数 0

在下面的方法中,如果我在completionHandler中进行数据处理,这是否会阻塞主线程?换句话说,在completionHandler中执行的操作是在主线程上完成的,还是在后台线程上完成的?

代码语言:javascript
复制
+ (void)sendAsynchronousRequest:(NSURLRequest *)request
                          queue:(NSOperationQueue*) queue
              completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*)) handler NS_AVAILABLE(10_7, 5_0);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-08 11:16:18

这取决于您支持的操作系统版本。根据documentation,在NSOperationQueue上执行完成处理程序块。

代码语言:javascript
复制
+(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和更高版本的单独线程上执行的。希望这比汤米的回答更清楚。

票数 0
EN

Stack Overflow用户

发布于 2013-02-08 07:30:17

对于每个the documentationqueue是:

处理程序块在请求完成或失败时被调度到的操作队列。

因此,handler将在那里执行。值得注意的是,对于实际的网址连接将在哪里完成,这两种方式都没有做出承诺,所以如果你想在主线程上完成,你应该只指定[NSOperationQueue mainQueue]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14763050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档