通知
//總結起來就三步
- 訂閱通知
- 發(fā)布通知
- 移除通知.
步驟:
- 1, 訂閱通知中心中的某個對象的通知.
- 2, 通知中心發(fā)布通知
- 3, 因為已經(jīng)訂閱了就自動調(diào)用,訂閱時,接收到通知會執(zhí)行的方法,然后完成了消息的傳遞.
** 注意:通知傳遞到方法內(nèi)可以和點擊事件一樣就通知對象傳遞過來,內(nèi)部就可以獲得通知的一些額外信息了. **
1. 首先每一個應用程序都有一個通知中心實例.(NSNotificationCenter),專門負責協(xié)調(diào)不同對象之間的消息通信.
2. 任何對象都可以向通知中心發(fā)布通知(NSNotification),描述自己在干嘛.其他感興趣的對象(observer監(jiān)聽者)可以申請某個特定的通知發(fā)布時(或者某個特定的對象發(fā)布通知時)收到這個通知.
3. 初始化一個通知對象
一定要理解每個參數(shù)
NSNotificationName:通知名
object:通知發(fā)布者(是誰要發(fā)布通知)
userInfo:額外信息(通知發(fā)布者傳遞給通知接收者的信息.)
NSNotification *no = [[NSNotification alloc]initWithName:(nonnull NSNotificationName) object:(nullable id) userInfo:(nullable NSDictionary *)];
4. 獲取當前APP的通知中心,發(fā)布通知.
發(fā)布通知的方法
1. 參數(shù):通知對象(這個創(chuàng)建的通知對象就包含了初始化通知的各種信息)
[[NSNotificationCenter defaultCenter]postNotification:(nonnull NSNotification *)];
2. NSNotificationName: 通知的名字
object: 通知的發(fā)布者.
[[NSNotificationCenter defaultCenter]postNotificationName:(nonnull NSNotificationName) object:(nullable id)];
3. NSNotificationName: 通知的名字
object: 通知的發(fā)布者.
[[NSNotificationCenter
userInfo: 發(fā)布者傳遞給接收者的一些額外信息.
defaultCenter]postNotificationName:(nonnull NSNotificationName) object:(nullable id) userInfo:(nullable NSDictionary *)]
5. 通知的監(jiān)聽器.
通知中心(NSNotificationCenter)提供了方法來注冊一個監(jiān)聽通知的監(jiān)聽器(Observer)
?observer:監(jiān)聽器幸乒,即誰要接收這個通知,誰要訂閱這個消息.
?aSelector:收到通知后舶胀,回調(diào)監(jiān)聽器的這個方法江耀,并且把通知對象當做參數(shù)傳入
?aName:通知的名稱婆排。如果為nil粪滤,那么無論通知的名稱是什么忆嗜,監(jiān)聽器都能收到這個通知
?anObject:通知發(fā)布者州胳。如果為anObject和aName都為nil衷笋,監(jiān)聽器都收到所有的通知
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
?name:通知的名稱
?obj:通知發(fā)布者
?queue:決定了block在哪個操作隊列中執(zhí)行客峭,如果傳nil豫领,默認在當前操作隊列中同步執(zhí)行
?block:收到對應的通知時,會回調(diào)這個block
- (id)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block;
6. 移除監(jiān)聽器
?** 通知中心不會保留(retain)監(jiān)聽器對象舔琅,在通知中心注冊過的對象等恐,必須在該對象釋放前取消注冊。否則,當相應的通知再次出現(xiàn)時课蔬,通知中心仍然會向該監(jiān)聽器發(fā)送消息囱稽。因為相應的監(jiān)聽器對象已經(jīng)被釋放了,所以可能會導致應用崩潰 **
- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;
一般在監(jiān)聽器銷毀之前取消注冊(如在監(jiān)聽器中加入下列代碼):
- (void)dealloc {
//[super dealloc]; 非ARC中需要調(diào)用此句
[[NSNotificationCenter defaultCenter] removeObserver:self];
}