最近在github上看到了lrnotificationobserver這個專案,看了一下實現方式,作者通過arc機制例項化註冊物件子類與關聯物件的方法來管理註冊物件的生命週期。從而省去了系統通知移除的過程,本篇介紹該專案實現過程。
註冊
[[nsnotificationcenter defaultcenter]
addobserver
:anobserver
selector:@selector(handlenotification:)
name:anotificationname
object:anobjectthatfiresthenotification];
移除
[[nsnotificationcenter defaultcenter]
removeobserver
:anobserver
name
:anotificationname
object
:anobjectthatfiresthenotification];
這是正常使用通知的情形,這樣使用存在兩個問題
lrnotificationobserver
物件的內部持有nsnotificationcenter
物件實際上是對nsnotificationcenter
基礎功能進一步的封裝。
lrnotificationobserver
有兩種方法初始化
@property (nonatomic, strong) lrnotificationobserver *backgroundobserver;
self
block:^(nsnotification *note) ];
這種方法需要宣告乙個lrnotificationobserver
物件作為屬性,根據arc記憶體管理當物件銷毀時物件的屬性也會一起銷毀
這種情況下作者把銷毀的方法寫在了lrnotificationobserver
物件的dealloc
方法中。
- (void)dealloc
- (void)stopobserving
- (void)clear
owner:self
block:^(nsnotification *note) ];
雖然不用例項化lrnotificationobserver
但是要傳入owner
引數,owner
相當於乙個鉤子,讓其與lrnotificationobserver
物件進行關聯。
+ (void)addobserver:(lrnotificationobserver *)observer aspropertyofowner:(id)owner
通過執行時關聯物件的方法將lrnotificationobserver
物件與owner
物件關聯,當owner
銷毀時關聯斷開,lrnotificationobserver
物件不被任何物件持有銷毀。執行dealloc
方法
lrnotificationobserver
可以指定通知方法執行佇列
[lrnotificationobserver observename:@"somenotificationthatshouldupdatetheui"
object:anobject
owner:anowner
dispatch_queue:dispatch_get_main_queue()
target:viewcontroller
selector:@selector(methodtobeexecutedonmainthread:)];
當收到通知後執行緒會自動切換到dispatch_queue
置頂佇列所在的執行緒中。
- (void)executenotificationfiredblock:(dispatch_block_t)block
else
}else
if (self
.dispatchqueue)
else
}else
}
作者通過是否指定dispatch_queue
與operationqueue
來判斷是否切換佇列,如果沒有指定那麼預設操作將在傳送通知的執行緒中執行。 NSNotification學習筆記
這是乙個觀察者模式。首先在你需要監聽的類中加入觀察者 void addobserver id observer selector sel aselector name nsstring aname object id anobject 這個觀察者在監聽到anobject傳送名字為aname的noti...
NSNotification 通知傳值
方法如下 在a頁面viewdidload中註冊乙個通知 objc view plain copy 註冊通知,進行傳值 name reloadvoewnotification 這個就是其唯一標示符.系統是用來做鑑別其惟一性,就是裝置標示符一樣 nsnotificationcenterdefaultce...
NSNotification通知的使用
nsnotification通知傳值的使用 1 建立通知 建立在當前需要使用的頁面 nsnotificationcenter defaultcenter addobserver self selector selector notificationmethod name customname obj...