2013-03-01 80 views
1

在单独的线程上运行代码的最佳方式是什么?NSOperation和NSURLConnection冲突

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]; 
} 

OR:

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

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

+0

这沃尔是有帮助的; HTTP://stackoverflow.com/questions/11496063/best-multithreading-approach-in- objective-c – rptwsthi 2013-03-01 06:53:15

+0

是不是你去寻求异步请求.. – Dany 2013-03-01 06:53:23

回答

3

使用与同步操作的请求队列会特别有用。操作队列不仅可以轻松指定并发操作,还可以指定maxConcurrentOperationCount来约束要运行的并发操作的数量(如果您要释放一大堆并发操作,这一点很重要,因为您只限于多少个并发操作可以与给定的服务器同时运行)。

如果您需要NSURLConnectionDataDelegate方法(例如,您想更新进度视图,想要执行某些流操作,希望能够以下任何一种原因),则后一个示例(如initWithRequest)取消连接等)。

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

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


顺便说一句,你也许可以简化第一个例子:

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

[queue addOperationWithBlock:^{ 
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&_response error:&_error]; 
}];