簡體   English   中英

NSOperation和NSURLConnection沖突

[英]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

在回答你的“哪個最好”這個問題時,它只取決於你想要做什么,因為它們都有利有弊。 但我更喜歡基於NSOperationNSURLConnection ,如果您想簡化開發工作,通常會建議使用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), ^{
    });

NSURLConnection支持兩種操作模式:異步和同步。 根本不使用單獨的線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM