2013-03-01 89 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]; 
}];