[英]NSOperation and NSURLConnection conflicts
在單獨的線程上運行代碼的最佳方法是什么?
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];
我一直在做第二種方式,但對此有點困惑或使用另一種方式來做到這一點。
如果要調用許多並發請求,則將操作隊列與同步請求一起使用尤其有用。 操作隊列不僅可以輕松指定並發操作,還可以指定maxConcurrentOperationCount
來約束您想要運行的並發操作數量(這一點非常重要,如果您因為限制了多少操作而解雇了一大堆並發操作可以與給定的服務器同時運行)。
如果您需要NSURLConnectionDataDelegate
方法,那么后一個示例(使用initWithRequest
)非常有用(出於多種原因,例如,您希望更新進度視圖,您希望執行某些流操作,您希望能夠取消連接等) )。
第三種方法是將initWithRequest
方法與NSOperationQueue
,即將NSURLConnection
包裝在其自己的NSOperation
。 這結合了這兩種技術,提供了豐富的NSURLConnectionDataDelegate
方法(可取消,進度更新等),具有操作隊列的強大功能(能夠將網絡請求添加到隊列中,您可以為其配置並發度,在操作之間建立依賴關系)等),但提供了一個很好的界面。 有一些特性可以正確實現這種方法(如果在NSOperationQueue
使用NSURLConnection
則必須為NSURLConnection
安排/創建一個NSOperationQueue
)。 因此,如果您希望享受這種技術的豐富性而不會迷失實現細節,我可能會建議使用第三方庫,例如AFNetworking 。
在回答你的“哪個最好”這個問題時,它只取決於你想要做什么,因為它們都有利有弊。 但我更喜歡基於NSOperation
的NSURLConnection
,如果您想簡化開發工作,通常會建議使用AFNetworking 。
順便說一下,你可以簡化第一個例子:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&_response error:&_error];
}];
使用Grand Central Dispatch(GCD),您可以在后台運行代碼,這也更容易。
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.