通知,就是說A觀察B的情況.如果B有所改動,就通知A讓A知道.這是一種松耦合的通信方式.
有兩種方法:
1. NSNotificationCenter通知中心
例子如下:
//建構自定義通知事件和發送
//通知的事件名稱, 和 參數
NSNotification *notification = [NSNotification notificationWithName:@"data changes" object:self];
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter postNotification:notification];
//訂閱這個通知後.上邊發送的消息,這裡才能收到
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
//update是收到通知後執行的方法, subject是上邊傳送過來的參數
[notificationCenter addObserver:self selector:@selector(update:) name:@"data changes" object:subject];
2. NSKeyValueObserving 鍵值對的方式
手動調用通知
在觀察者的類裡加上如下代碼
//把自身作為觀察者加到scribble裡
//注冊@"mark" 為鍵 scribble為值
[scribble addObserver:self forKeyPath:@"mark"
opations:NSKeyValueObservingOptionInitial |
NSKeyValueObservingOptionNew
context:nil];
收到通知後執行的方法
//在觀察者的代碼裡加上處理收到通知後的方法
- (void) observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
//如果是來自注冊mark的通知就執行并且判斷發送通知的來源是否是Scribble類
if( [object is KindOfClass:[Scribble class]] && [keyPath isEqualoString:@"mark"] )
{
//NSKeyValueChangeNewKey是用來擷取Scribble裡改動的值
id mark = [change objectForKey:NSKeyValueChangeNewKey];
//..一些處理
}
}
在被觀察者的類裡加上
//在scribble類裡有變動的地方執行以通知觀察者
//這裡執行完didChangeValueForKey後會發送一條通知執行以下代碼
[self willChangeValueForKey:@"mark"];
....//一些改動
[self didChangeValueForKey:@"mark"];
至此,通知差不多就是這,慢慢練練就是熟悉了!