2012-03-15 46 views
0

我想清理我的一個項目,並在一個類中提取我經常重用的部分源代碼。 該類處理一些對Web服務的請求,目前爲止一切正常;)。在我將代碼提取到它自己的類之前,我使用調用類中的線程和回調來處理這些請求。iOS線程 - 回調最佳實踐

現在我有一個「最佳實踐」的問題:

在我的代碼我像做(簡體):

(void)foo{ 
    Helper *h =[[Helper alloc]init]; 
    [h doRequest]; 
} 

doRequest進行網絡操作(在其自己的類),我有等到這是請求完成。所以我需要一個回調或類似的東西。

我應該只是線程doRequest incl。 waituntildone = YES?

我是否還需要在Helper類中進行聯網?抑或是足以調用該方法螺紋是這樣的:

[NSThread detachNewThreadSelector:@selector(h doRequest) toTarget:self withObject:nil]; 

什麼是最好的做法是從doRequest得到一個回調給調用者類,它已經完成後,它的任務,這樣我可以處理從返回的值網絡服務?

在此先感謝。

約翰內斯

回答

3

鑑於doRequest不會返回,直到該請求完成後,你可以做

- (void)fooCompletion:(void (^)(void))completion { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     Helper *h =[[Helper alloc]init]; 
     [h doRequest]; 
     if (completion) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       // doRequest is done 
       completion(); 
      }); 
     } 
    }); 
} 

調用的方法:

[self fooCompletion:^{ 
    // do something after doRequest is done 
}]; 
+0

似乎工作:) 謝謝 – 2012-03-18 16:10:42

2

我個人比較喜歡叫performSelectorOnMainThread:withObject:waitUntilDone :在任何需要發送信息的助手線程結束時。

[self performSelectorOnMainThread:@selector(infoFromService:) withObject:aDictionaryWithInfo waitUntilDone:NO]; 

- (void)infoFromService:(NSDictionary *)aDictionary { 
    //Process all the information and update UI 
} 

一定要始終使用主線程任何UI更新,即使它們發生在工作線程的中間,例如更新的多少信息已被下載的次數。使用相同的技術來調用主線程的相關信息。