NSNotification系統通知優化

2021-07-14 18:40:32 字數 2376 閱讀 4452

最近在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_queueoperationqueue來判斷是否切換佇列,如果沒有指定那麼預設操作將在傳送通知的執行緒中執行。

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...