sendAsynchronousRequest NSURLConnectionRequest

时间:2013-02-07 23:26:18

标签: iphone ios objective-c ipad

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

+ (void)sendAsynchronousRequest:(NSURLRequest *)request
                          queue:(NSOperationQueue*) queue
              completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*)) handler NS_AVAILABLE(10_7, 5_0);

2 个答案:

答案 0 :(得分:1)

the documentationqueue为:

  

请求完成或失败时将处理程序块分派到的操作队列。

所以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及更高版本的不同线程上执行。希望这比汤米的回应更清楚。