2010-07-29 90 views
1

我有一個與服務器通信的類(我們稱之爲'Downloader')。有時候,服務器可能會因拒絕登錄而拒絕連接。這個類的實例被許多不同的對象通過我的程序使用,當登錄被拒絕時,Downloader需要告訴RootViewController顯示一個登錄界面。許多利用下載器的實例沒有到RootViewController的參考類的,所以我送通過我的應用程序代理(其中有RootViewController的參考)的消息,像這樣:正確使用應用程序委託來發送消息

[[[UIApplication sharedApplication] delegate] loginFailed]; 

的應用程序委託會告訴rootViewController顯示登錄界面。我的問題是:這是做到這一點的最佳方法嗎?它有效,但我試圖堅持編碼慣例。有沒有更好的辦法?

+0

感謝所有偉大的答案!對此,我真的非常感激! – Chris 2010-07-30 22:19:56

回答

1

你的方法很常見和正確。我發現,如果你正在做的這個時候,你可能要添加一個輔助方法是這樣的:

// in your <myappdelegateclassname>.h 
+(void)loginFailed; 

// in your <myappdelegateclassname>.m 
+(void)loginFailed 
{ 
    [[[UIApplication sharedApplication] delegate] loginFailed]; 
} 

然後在你的應用程序的任何地方,你可以使用:

[<myappdelegateclassname> loginFailed]; 

只需更換以上所有的名字你類名稱。

2

這是使用通知的好時機。

您可以讓應用程序委託(或任何類)訂閱特定的命名通知,讓其知道登錄失敗,然後拉出登錄表。後臺下載器只需發佈通知,然後它不關心之後會發生什麼。中間的班級都不知道發生了什麼事情(除非他們不會獲取他們要求的數據)。

這裏的電話一個非常簡單的概述:

http://mac-objective-c.blogspot.com/2009/02/nsnotifications-broadcasting-mechanism.html

+0

+1;並且使用通知模式,可以避免在應用程序中涉及App Delegate。該根視圖控制器可以進行監聽,並根據需要作出反應。 – ohhorob 2010-07-29 05:44:47