2009-11-17 76 views
3

我正在使用ASIHTTPRequest與服務器異步通信。它工作得很好,但我在不同的控制器中執行請求,現在重複的方法在所有這些控制器中。在單個類中抽象代碼(請求)的最佳方式是什麼,因此我可以輕鬆地重新使用代碼,這樣我就可以使控制器更簡單。我可以把它放在單身人士(或在應用程序委託),但我不認爲這是一個好方法。或者可以使用委託回調爲其創建自己的協議。ASIHTTPRequest代碼設計

一個良好的設計方法,任何意見將是有益的。謝謝。

回答

7

我使用的奔科普塞的ASIHTTPRequest非常沉重的Web服務客戶端,我希望在接下來的幾個星期才能完成的子類。這是一個偉大的項目,他的工作爲我節省了大量的時間和精力。

我有一個ASINetworkQueue在應用程序委託成立。隊列發送-go消息,以便它可以接收請求。我將我的子類請求添加到此隊列中。每個請求都會被處理併發布其通知,並且我的視圖控制器會相應地處理響應數據。

我所做的是子類ASIHTTPRequest和:

  1. 搭建-init方法(或-initWithParams:方法,根據請求)
  2. 覆蓋-requestFailed:-requestCompleted:處理來自回來HTTP錯誤信息web服務
  3. 我的視圖控制器註冊以觀察來自-requestCompleted:方法中的錯誤處理的NSNotification通知

作爲視圖控制器被推上並彈出導航堆棧,我添加和刪除不同的註冊。一些視圖控制器只需要偵聽特定的子類請求類型。

收聽NSNotification允許我發出UIAlertView對話框,讓用戶知道出了什麼問題,或者在請求產生成功的HTTP錯誤時處理請求響應數據(例如將結果饋送到Core Data存儲區)。

請求是否成功或失敗,我記得-release請求時,我用它做。

+0

您是否必須處理服務器端的訪問令牌?在我的情況下,我必須發出3-4個請求,我不確定他們是否會成功或失敗。如果它們失敗了,我將不得不要求一個新的訪問令牌,然後重新運行失敗的請求。另外我失敗了,沒有理由去運行其他人,直到我得到新的令牌。如果可用,只需重新運行等待隊列中的那些。 – Zsolt

0

我寫了一個單獨的類來處理這個問題。

static TCHttpRequest *_sharedHttpRequest = nil; 
+ (id)sharedRequest 
{ 
    @synchronized(self){ 
     if (_sharedHttpRequest == nil) { 
      _sharedHttpRequest = [[self alloc] init]; 
     } 
    } 
    return _sharedHttpRequest; 
} 


- (NSDictionary *)loginWithUserName:(NSString *)user password:(NSString *)pwd 
{ 
    NSURL *url = [NSURL URLWithString:@"/login" relativeToURL:_url]; 

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
    [request setCachePolicy:ASICacheForSessionDurationCacheStoragePolicy]; 
    [request setTimeOutSeconds:HTTP_REQ_TIMEOUT]; 
    [request addPostValue:user forKey:@"username"]; 
    [request addPostValue:pwd forKey:@"password"]; 
    request.delegate = self.delegate; 
    [_common_queue addOperation:request]; 
} 
0

我看不出類方法和實例方法是如何相關的?類方法實例化TCHttpRequest並保證只有一個實例。 loginWithUserName實例方法實例化一個ASIFormDataRequest並將其添加到通用隊列。我在這裏看不到任何重用?