天天看點

IOS 之 通知NSNotificationCenter

    通知,就是說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"];  
           

至此,通知差不多就是這,慢慢練練就是熟悉了!