要了解通知、KVO、代理的區(qū)別,合理利用。
[A]通知是什么:
通知(NSNotification)是iOS的一種設(shè)計模式,觀察者Observer模式。
[B]通知的作用:
可以在一個應(yīng)用中的多個對象之間進(jìn)行通信傳遞數(shù)據(jù)。
【注:經(jīng)常提到的通知,有“廣播通知”、“本地通知”、“推送通知”
本文所介紹的就是廣播通知,是實現(xiàn)觀察者模式的一種機制,可以在一個應(yīng)用中的多個對象之間進(jìn)行通信傳遞數(shù)據(jù)。
而本地通知和推送通知主要是給用戶發(fā)送“通知提示”,例如警告提示、聲音、震動以及如圖標(biāo)上的紅色數(shù)字提示。
第一種由“本地發(fā)送通知”給用戶,第二種由第三方應(yīng)用發(fā)送給蘋果官方的遠(yuǎn)程服務(wù)器,然后再由服務(wù)器“推送通知”給用戶。】
[C]通知實現(xiàn)方法:
1.注冊通知
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSString *)aName object:(nullable id)anObject;
//@selector中為回調(diào)方法,在本類中對通知進(jìn)行相應(yīng)的處理,name為通知名稱、object為對象;
完整的添加觀察者過程為:
if([observer respondsToSelector:@selector(MyMethod:)]) {[[NSNotificationCenterdefaultCenter] addObserver:observer selector:@selector(MyMethod:) name:NSWindowDidBecomeMainNotificationobject:nil];}
當(dāng)然在蘋果API中也有另外一個注冊觀察者的方法:
- (id)addObserverForName:(nullableNSString*)name object:(nullableid)obj queue:(nullableNSOperationQueue*)queue usingBlock:(void(^)(NSNotification*note))block
此方法是支持在該方法中進(jìn)行block回調(diào)的,而queue參數(shù)就是表示此模塊在queue隊列中進(jìn)行。
2.發(fā)布者的類發(fā)布通知
可以使用一下三個方法:
- (void)postNotification:(NSNotification*)notification;- (void)postNotificationName:(NSString*)aNameobject:(id)anObject;- (void)postNotificationName:(NSString*)aNameobject:(id)anObject userInfo:(NSDictionary*)aUserInfo;
postNotificationName:指定消息名稱;
object:指定發(fā)消息者;
userInfo:通知中用于傳遞參數(shù)的載體,傳遞的方法是把參數(shù)放在NSDictionary類型的userInfo中。例如:NSDictionary *dict = [notification userInfo];
一般使用第三個方法,如果參數(shù)不需要的,可以設(shè)置為nil.
3.移除通知
//釋放所有通知
- (void)removeObserver:(id)observer;
//釋放名稱為aName的通知
- (void)removeObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject;
[D]有用的系統(tǒng)通知
UIApplicationDidFinishLaunchingNotification? // 應(yīng)用程序啟動后
UIApplicationDidBecomActiveNotification? ? ? //進(jìn)入前臺
UIApplicationWillResignActiveNotification? ? //應(yīng)用將要進(jìn)入后臺
UIApplicationDidEnterBackgroundNotification? //進(jìn)入后臺
UIKeyboardWillShowNotification? ? ? // 鍵盤即將顯示
UIKeyboardDidShowNotification? ? ? ? // 鍵盤顯示完畢
UIKeyboardWillHideNotification? ? ? // 鍵盤即將隱藏
UIKeyboardDidHideNotification? ? ? ? // 鍵盤隱藏完畢
本文參考自:http://www.lxweimin.com/p/91011457bd75