iPhone開發之NSNotificationCenter(通知)的使用方法
NSNotificationCenter 是 Cococa消息中心,統一管理單進程內不同線程的消息通迅,其職責只有兩個:
1,提供“觀查者們”對感興趣消息的監聽注冊;
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(printName:) name: @"messageName" object:nil];
a, defaultCenter,消息中心只有一個,通過類方法獲取它的單例。
b, addObserver,添加監聽者實例,此處為當前實例
c, selector,observer中的一個方法指針,當有消息的時候會執行此方法,並把相關上下文以參數傳遞過去
d, name,注冊所關心消息的名稱,
e, object,這個是對消息發送方的一個過濾,此參數據說明當前監聽器僅對某個對象發出的消息感興趣。
整體意思:
向消息中心中注冊一個“監聽者”(當前實例self, 相當於Java里的this)。當有名為NSWindowDidBecomeMainNotification 的消息發送到消息中心時,執行本實例的aWindowBecameMain方法。
2,接收“消息”,並把消息發送給關心它的“觀查者們”。
消息的推送:
- [[NSNotificationCenter defaultCenter] postNotificationName:@"messageName" object:nil userInfo: [NSDictionary dictionaryWithObject:@"jory" forKey:@"name"|^Archive.zip]];
a, postNotificationName,推送消息的名稱,匹配在注冊消息監聽者時的消息名稱。
b, object, 發送消息的實例
c, userInfo,發送消息時附帶的消息上下文,此實例為一個字典實例(相當於Java里的HashMap)。
3,當有消息推送到消息中心后,會把此消息發送給相關的“監聽者”,並會執行消息注冊時的方法:
- -(void)printName:(id)sender{
- NSString *name = [[sender userInfo] objectForKey:@"name"];
- NSLog(@"name: %@",name);
- }
方法很簡單,從消息上下文中(發送消息時的 userInfo),獲取"name"並打印。
iPhone軟件開發的時候會遇到這種情況:打開APP后會在后台運行某個方法,例如下載文件,下載完成后可能需要調用某個方法來刷新界面,這時候可能沒法在下載的函數中回調。(通知)NSNotificationCenter是一個很好的選擇。
通知使用起來灰常的簡單:
1、定義通知:
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(callback) name: @"back" object: nil];
2、定義通知中使用的方法:
- (void)callback{ NSLog(@"i am back."); }
3、調用通知:
- (void)getIT{ NSLog(@"get it."); //發出通知 [[NSNotificationCenter defaultCenter] postNotificationName:@"back" object:self]; }
在調用通知的時候程序會在整個項目中尋找此通知的名稱,找到后發出請求,因此通知的名稱需要在整個項目中唯一。