1

在单独的线程上运行代码的最佳方式是什么?

 NSInvocationOperation *operationToComplete = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationMethod) object:nil];
 NSOperationQueue *queueToStart=[[NSOperationQueue alloc] init];
 [queueToStart addOperation:operationToComplete];

 -(void) operationMethod
 {
   NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&_response error:&_error];
 }

或者:

 NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request
                                                            delegate:self];

我一直在做第二种方式,但对此有点困惑或使用另一种方式来做到这一点。

4

2 回答 2

3

如果您有许多要调用的并发请求,则将操作队列与同步请求一起使用会特别有用。操作队列不仅可以轻松指定并发操作,还可以指定maxConcurrentOperationCount限制要运行的并发操作数量(如果您要启动一大堆并发操作,这一点很重要,因为您受限于可以运行的数量与给定的服务器同时运行)。

如果您需要这些方法(出于多种原因,例如您想要更新进度视图、您想要执行一些流式操作、您想要能够取消连接等),您的后一个示例(带有initWithRequest)很有用。 NSURLConnectionDataDelegate.

第三种方法是将initWithRequest方法与 an 结合NSOperationQueue起来,即将 the 包裹NSURLConnection在其自身NSOperation中。这结合了这两种技术,提供了丰富的NSURLConnectionDataDelegate方法(可取消、进度更新等),以及操作队列的强大功能(能够将网络请求添加到队列中,您可以为其配置并发度,建立操作之间的依赖关系,等),但提供了一个很好的界面。有一些特质可以正确实现这种方法(NSURLConnection如果你在NSOperationQueue. 因此,我可能会建议您使用第三方库,例如AFNetworking,如果您想享受这项技术的丰富性而又不会迷失在实现细节中。

在回答您“哪个最好”的问题时,这仅取决于您要做什么,因为它们都有优点和缺点。但我更喜欢NSOperation-based ,如果您想简化开发工作NSURLConnection,通常会建议使用AFNetworking 。


顺便说一句,您可能可以简化第一个示例:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[queue addOperationWithBlock:^{
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&_response error:&_error];
}];
于 2013-03-01T07:31:17.813 回答
0

使用 Grand Central Dispatch (GCD),您可以在后台运行代码,这也更容易。

    dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    });

而且NSURLConnection 还支持两种操作模式:异步和同步。根本不使用单独的线程。

于 2013-03-01T06:56:32.443 回答