今天做項目竟然忘了通知怎么用,可能是block用多了把...
怒寫一篇通知博客,給自己長點記性!!!
系統給我們準備了一個>單例<設計模式的消息中心
[NSNotificationCenter defaultCenter]
為什么是單例呢,比如在內存中只能存在一個的類(比如說音樂播放器,數據庫隊列(FMDB)等),或者常用的工具類(比如網絡請求/賬號管理/操作數據庫/APP配置等),還有我們要認識的通知中心.這些都需要設計成單例模式,方便使用,節省內存,保證數據安全等.相對的,單例模式也有它的缺點.它不應該頻繁創建,因為每創建一個單例對象,它就會在內存中永久存在,直到程序退出.
我們可以從單例的實例化方法得出以上結論:
+ (instancetype)sharedTool {
static NetWorkTool *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
///子類調用父類實例化方法
instance = [self manager];
});
return instance;
}
這是一個AFN網絡管理工具的單例模式,結合GCD的高級功能.
好了,繞了一大圈,讓我們回到通知
我們先來看發送通知的方法(以post開頭):
- (void)postNotificationName:消息名字
object:發送消息的對象
userInfo:傳遞的內容
讓我們來了解一下參數:
@property (readonly, copy) NSNotificationName name;
@property (nullable, readonly, retain) id object;
@property (nullable, readonly, copy) NSDictionary *userInfo;
name:消息對象的唯一標識,用于辨別消息對象,可以使用系統原生(比如用來監聽鍵盤彈出),也可以自定義.
object:指定接收消息的對象,為nil時消息傳遞給所有監聽該消息的對象,否則只有指定對象可以接收消息.
userInfo:傳遞給監聽者的消息內容.
再來看接收通知的方法
- (void)addObserver:觀察者(一般為self)
selector:監聽方法 (一般要加:冒號.代表有參數,參數為NSNotification)
name:消息名字
object:發送消息的對象;
接收到消息之后,在監聽方法里面可獲得傳遞過來的參數.使用notification.userInfo接收(字典)
注意:通知需要在控制器的生命周期方法中移除,否則會造成內存泄漏
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"消息名字"
object:nil];
通知相比block,代理這兩種傳值的方法,它的優勢就是可以跨控制器發送消息/傳值,但是使用的時候一定要注意通知的移除.
預告一下:明天學習block.