通知(Notification)是一種發送給一個或者多個觀察者,用來通知其在程序中發生了某個時間的消息。通知機制遵循的時一種廣播的模式。它是一種程序中時間的發起者或者是處理這和其餘想要知道該時間的對象的溝通的一種方式。消息的接收者,也就是觀察者響應該時間來變換本身的UI、行爲或是狀態。發送通知的對象沒有必要知道這些觀察者都是誰。所以,通知是一種在程序中能夠得到高校協做同時保持高內聚性的機制。他減小了程序中對象相互之間的強依賴性。併發
通知機制的核心就是一個進程中單一實例的對象,被叫作通知中心(NSNotificationCenter)。當一個對象發佈一個通知時,通知就會先被髮布到通知中心。通知中心的做用至關因而交流所,做爲通知的廣播中心。程序中其餘須要感知時間的對象經過向通知中心註冊就能夠達到在時間發生時被通知中心及時通知獲得目的。通知中心是能夠以同步的方式向其觀察者發送通知,也是能夠經過使用通知隊列(NSNotificationQueue)來異步地發送通知。框架
iOS中,通知分爲系統通知、自定義通知、本地通知、推送通知。異步
1.系統通知:系統通知是cocoa框架定義好的通知,開發者只須要在通知中心區註冊通知,至於何時發送通知,由系統決定。系統定義好了這些通知的發送時機,通常由通知的名稱體現。post
下面是iOS系統通知的示例代碼:spa
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinish:)name:UIKeyboardWillShowNotification object:nil];
以上代碼中:code
[NSNotificationCenter defaultCenter]是建立一個通知中心對象,它是一個單例。orm
addObserver:觀察者。server
selector:方法選擇器,當接收到通知時執行()內的方法。對象
name:所要監聽的關鍵詞(由系統定義)。隊列
object:發送通知的對象,這裏置爲nil;
用完系統通知後,要在通知中心移除。通常放在dealloc方法(對象銷燬時自動執行的方法)中移除(重寫dealloc方法),也能夠放在須要的地方移除。
代碼示例:
-(void)dealloc{ [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillShowNotification object:nil]; }
(重寫dealloc方法,在對象銷燬時從通知中心移除名爲「UIKeyboardWillShowNotification」的系統通知)
2.自定義通知
自定義通知是指開發人員本身來定義通知。自定義通知的通常步驟:
1.註冊監聽者。
2.建立併發送通知。
3.移除監聽者。
其中,第一步和第三步與系統通知的使用方法是同樣的,不一樣的是系統通知是系統發送的,自定義通知是開發者自定義發送的。
示例代碼:
// 建立併發送通知
[[NSNotificationCenter defaultCenter]postNotificationName:@"News" object:nil userInfo:@{}];
以上代碼中:
Name:要發送的通知的名字;
object:發送通知的對象,這裏置爲nil;
userInfo:要發送的通知的內容,字典形式。
同系統通知同樣,使用完畢後要在對象銷燬時或者在須要的地方從通知中心移除。
3.本地通知
// 待添加
4.推送通知
// 待添加
通知和KVO的區別:
KVO只能監聽屬性的變化,經過NSString類型的屬性名來實現。實現了自動監聽,當屬性值變化是,會自動通知觀察者,再也不添加代碼了。可是觀察者得持有被觀察者的引用,以便被觀察者註冊觀察者,耦合性過高,不利於代碼的維護。
NSNotificatin比較靈活,能夠監聽的內容不侷限於屬性的變化,還能夠對多種多樣的狀態變化進行監聽,監聽範圍廣,使用也更靈活。可是需呀被觀察者手動發送通知,觀察者註冊監聽後才能進行響應,比KVO多了發送通知的一部。可是註冊監聽不須要被觀察者的引用,沒有耦合性,利於代碼維護。
使用通知時常見的錯誤:
1.通知名稱填寫不正確,能夠在.pch文件中聲明宏,以便填寫名稱時自動填寫。
2.忘記從通知中心移除。