2014-01-21 107 views
0

目前我正在構建一個異步連接到Web服務器的iOS應用程序。我對Web服務進行了大約5次不同的調用,具體取決於我使用的是哪個視圖控制器。在很多視圖中,我最終進行了相同的調用,因此我有很多相同/相似的代碼。你們對我如何限制我所做的代碼重用量有任何建議嗎?我正在考慮創建一個具有所有這些異步調用方法/代碼的特殊類,然後在每個View控制器上,我可以實例化特殊類並調用任何我想要的方法。這個問題是因爲我正在進行異步調用,我怎麼知道哪個視圖控制器將數據發回(通過回調)。我知道應該有一個簡單,優雅的方式來實現這一點,但我只是新的這種思維方式,所以幫助將不勝感激。Iphone連接到Web服務器,設計問題

回答

0

通常我所做的是負責請求的類(或者其中的一部分取決於請求的數量以及它們在邏輯上是如何相關的)。

想象一下你有一個NetworkManager。在這個管理器中,如果你需要保持狀態或只使用類方法,你可以有一個單例。所有的方法都應該至少有一個完成塊,當你用於服務器的異步方法有響應時將會調用這個塊。

typedef void (^NetworkCompletionBlock)(NSError *error, NSArray* data); 

然後調用方法是這樣的::

+(void) requestInfoFromServerOnCompletion:(NetworkCompletionBlock)onComplete; 

然後,在你的方法,你打電話給你的異步函數,當他們完成

塊可以用一個typedef來定義你可以用他所要求的參數調用onComplete塊,如下所示:

if(onComplete) 
    onComplete(yourError, yourDataArray); 

致電此類方法只是做:

[NetworkManagerrequestInfoFromServerOnCompletion:^(NSError *error, NSArray* data)){ 
    if(error) 
     NSLog(@"Ops, an error ocurred"); 
    else 
     NSLog(@"Received data: %@", data); 
}]; 

你也可以有兩大塊,一個錯誤和一個完成。

根據您的要求,您可能需要將塊保存到NetworkManager中。想象一下,你使用NSURLConnection代表。您必須將您的塊保存在networkManager單例中,然後在請求完成時調用它。

要做到這一點,你需要在你的單身聲明屬性:

@property (nonatomic, copy) NetworkCompletionBlock onRequestCompletedBlock; 

,然後在你的方法,你這樣做:

self.onRequestCompletedBlock = onComplete; 

當請求完成後,你可以撥打:

self.onRequestCompletedBlock(requestError, requestDataArray); 

請注意,如果你這樣做,你需要小心retain cycles

+0

我在這裏有點困惑,特別是在你說的那部分「然後,在你的方法上,你調用你的異步函數,當它們完成時,你用他請求的參數調用onComplete塊。 onComplete塊部分有點讓我困惑。 – AyBayBay

+0

因此,您將代碼塊作爲參數傳入? – AyBayBay

+0

是的,你傳遞一個調用塊作爲參數。如果你能說出你是如何打電話給你的服務器的話,那將會容易得多。我會盡量在一秒內更具體。 –