2010-06-29 38 views
0

我的應用程序目前有我很確定是一個糟糕的設計,但我不知道如何組織它更好。例如:LoginViewController將用戶名和密碼的輸入文本發送給UserController的實例。 UserController通過NetworkRequestController向我的服務器發送一個請求來驗證用戶名和密碼,NetworkRequestController負責處理所有客戶端 - 服務器通信。 NetworkRequestController解析服務器的JSON響應並將其發送回UserController上的指定選擇器,然後在通知結果視圖之前完成所有業務。代表團和選擇器

目前,在LoginViewController的viewDidLoad方法中,UserController實例化爲LoginViewController的本地屬性 - 雖然我覺得我更喜歡它是單例類。問題是我需要在UserController上設置另一個對象(如LoginViewController)作爲委託,以便通過適當的選擇器將登錄結果返回到視圖。

//LoginViewController sends request to local UserController instance 
[userController validateLoginWithDelegate:self 
    withResult:@selector(loginResult:) 
    forEmail:email.text 
    forPassword:password.text]; 

//UserController asks NetworkRequestController to send login to server 
- (void)validateLoginWithDelegate:(id)delegateObj 
    withResult:(SEL)onResult 
    forEmail:(NSString *)email 
    forPassword:(NSString *)password { 

    if(delegateObj != nil && onResult != nil){ 
     self.delegate = delegateObj; 
     self.resultSelector = onResult; 
    } 

    NSString *url = [NSString stringWithFormat:@"/UserService.cfc?method=Authenticate&email=%@&password=%@&returnFormat=JSON", email, password]; 

    [[NetworkRequestController sharedNetworkRequestController] 
     requestJSONWithURLString:url 
     andDelegate:self 
     onFinished:@selector(onLoginResult:) 
     onFailed:nil 
     onOffline:nil 
     progressView:nil 
     timeout:30]; 

} 

//NetworkRequestController sends the request to the server and sends the parsed JSON back to UserController 
[delegate performSelector:onFinished withObject:parsedJSON]; 

//UserController does it's business and sends the result to the view 
if(delegate != nil && resultSelector != nil){ 
    [delegate performSelector:resultSelector withObject:result]; 
} 

我只一直在與對象 - 和可可幾個月,我敢肯定這是幾乎算好,但我更一定有我丟失的東西。這可以通過協議來實現嗎?建議嗎?

+0

請記住,可以多次調用viewDidLoad(即視圖可以在內存警告中卸載並在需要時重新加載視圖)。在init中初始化事物更安全; viewDidLoad旨在允許您在從nib加載視圖層次結構後修改視圖層次結構,而不是加載其他視圖控制器。 – 2010-06-29 12:49:09

回答

0

代表適用於服務於不同角色的對象之間的雙向通信。通常,一個對象知道如何做某事,另一個對象,委託人知道該怎麼做。

當您有單向通信時,通知通常是更好的選擇。你不需要一個代表與單向溝通的形式。

兩者可以一起使用。例如,UIApplication有一個委託,但也會發送許多委託調用的通知。

如果UserController是單身人士,那麼任何實例都可以發出請求,並且可以向所有感興趣的對象廣播結果通知。

[NSNotificationCenter defaultCenter]在您的應用程序內發送通知。