日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

你真的了解NSNotificationCenter吗?

發布時間:2025/3/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你真的了解NSNotificationCenter吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一:首先查看一下關于NSNotificationCenter的定義

@interface NSNotificationCenter : NSObject {@packagevoid * __strong _impl;void * __strong _callback;void *_pad[11]; }//單例獲得消息中心對象 + (NSNotificationCenter *)defaultCenter;//增加消息監聽 第一個參數是觀察者為本身,第二個參數表示消息回調的方法,第三個消息通知的名字,第四個為nil表示表示接受所有發送者的消息 - (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSString *)aName object:(nullable id)anObject;//發送通知 三種方式 - (void)postNotification:(NSNotification *)notification; - (void)postNotificationName:(NSString *)aName object:(nullable id)anObject; - (void)postNotificationName:(NSString *)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;//移除監聽 - (void)removeObserver:(id)observer; //移除監聽特定消息 - (void)removeObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject;//增加監聽 又提供了一個以block方式實現的添加觀察者的方法 - (id <NSObject>)addObserverForName:(nullable NSString *)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block NS_AVAILABLE(10_6, 4_0);@end

每一個程序都有一個自己的通知中心,即NSNotificationCenter對象。NSNotificationCenter這個也是我們平常用到的相關消息內容操作;NSNotificationCenter是一個單列,我們可以通過defaultCenter來獲取到通知中心這個單列;通知中心實際上是iOS程序內部之間的一種消息廣播機制,主要為了解決應用程序內部不同對象之間解耦而設計。它是基于觀察者模式設計的,不能跨應用程序進程通信,當通知中心接收到消息之后會根據內部的消息轉發表,將消息發送給訂閱者;

知識點1:消息的運用步驟

1:創建通知并發送

NSNotification *notification =[NSNotification notificationWithName:@"qjwallet" object:nil userInfo:nil];//通過通知中心發送通知[[NSNotificationCenter defaultCenter] postNotification:notification];

2:在接收的頁面注冊消息通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(qjwalletNotification:) name:@"qjwallet" object:nil];

3:處理接收到的內容,并進行操作

- (void)qjwalletNotification:(NSNotification *)text{//NSLog(@"%@",text.userInfo[@"orderid"]);NSLog(@"-----接收到通知------"); }

4:移除消息通知

-(void)dealloc {[[NSNotificationCenter defaultCenter]removeObserver:self name:@"qjwallet" object:nil]; }

知識點2:關于創建通知并發送另外兩個方法

方法1:[[NSNotificationCenter defaultCenter] postNotificationName:@"First" object:@"博客園"]; 方法2: NSDictionary *dict=[[NSDictionary alloc]initWithObjects:@[@"keso"] forKeys:@[@"key"]]; [[NSNotificationCenter defaultCenter] postNotificationName:@"Second" object:@"http://www.cnblogs.com" userInfo:dict];

上面兩個方法已經把NSNotification對象封裝一層,所以只要傳入相關的對象屬性就可以;

知識點3通過NSNotificationCenter注冊通知NSNotification,viewDidLoad中

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationFirst:) name:@"First" object:nil];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationSecond:) name:@"Second" object:nil]; -(void)notificationFirst:(NSNotification *)notification{NSString *name=[notification name];NSString *object=[notification object];NSLog(@"名稱:%@----對象:%@",name,object); }-(void)notificationSecond:(NSNotification *)notification{NSString *name=[notification name];NSString *object=[notification object];NSDictionary *dict=[notification userInfo];NSLog(@"名稱:%@----對象:%@",name,object);NSLog(@"獲取的值:%@",[dict objectForKey:@"key"]); }

知識點4:移除通知消息

-(void)dealloc{NSLog(@"觀察者銷毀了");[[NSNotificationCenter defaultCenter] removeObserver:self]; }也可以針對某一個進行移除:[[NSNotificationCenter defaultCenter] removeObserver:self name:@"First" object:nil];

知識點5:如果notificationName為nil,則會接收所有的通知(如果notificationSender不為空,則接收所有來自于notificationSender的所有通知)。如代碼清單1所示。如果notificationSender為nil,則會接收所有notificationName定義的通知;否則,接收由notificationSender發送的通知。監聽同一條通知的多個觀察者,在通知到達時,它們執行回調的順序是不確定的,所以我們不能去假設操作的執行會按照添加觀察者的順序來執行

知識點6addObserverForName監聽消息處理跟addObserver的差別

在前面addObserver有介紹它的四個參數作用,分別指定了通知的觀察者、處理通知的回調、通知名及通知的發送對象;而addObserverForName同樣是監聽消息處理,只是它并沒有觀察者,卻多出一個隊列跟一個block的處理;addObserverForName參數說明,name和obj為nil時的情形與前面一個方法addObserver是相同的。如果queue為nil,則消息是默認在post線程中同步處理,即通知的post與轉發是在同一線程中;但如果我們指定了操作隊列,情況就變得有點意思了,我們一會再講。block塊會被通知中心拷貝一份(執行copy操作),以在堆中維護一個block對象,直到觀察者被從通知中心中移除。所以,應該特別注意在block中使用外部對象,避免出現對象的循環引用。如果一個給定的通知觸發了多個觀察者的block操作,則這些操作會在各自的Operation Queue中被并發執行。所以我們不能去假設操作的執行會按照添加觀察者的順序來執行。該方法會返回一個表示觀察者的對象,記得在不用時釋放這個對象。

實例在指定隊列中接收通知:

@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];[[NSNotificationCenter defaultCenter] addObserverForName:TEST_NOTIFICATION object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {NSLog(@"receive thread = %@", [NSThread currentThread]);}];dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSLog(@"post thread = %@", [NSThread currentThread]);[[NSNotificationCenter defaultCenter] postNotificationName:TEST_NOTIFICATION object:nil];}); }@end

在這里,我們在主線程里添加了一個觀察者,并指定在主線程隊列中去接收處理這個通知。然后我們在一個全局隊列中post了一個通知。我們來看下輸出結果:

post thread = <NSThread: 0x7ffe0351f5f0>{number = 2, name = (null)} receive thread = <NSThread: 0x7ffe03508b30>{number = 1, name = main}

可以看到,消息的post與接收處理并不是在同一個線程中。如上面所提到的,如果queue為nil,則消息是默認在post線程中同步處理;

二:關于NSNotification的定義

@interface NSNotification : NSObject <NSCopying, NSCoding> //這個成員變量是這個消息對象的唯一標識,用于辨別消息對象 @property (readonly, copy) NSString *name; // 這個成員變量定義一個對象,可以理解為針對某一個對象的消息,代表通知的發送者 @property (nullable, readonly, retain) id object; //這個成員變量是一個字典,可以用其來進行傳值 @property (nullable, readonly, copy) NSDictionary *userInfo;// 初始化方法 - (instancetype)initWithName:(NSString *)name object:(nullable id)object userInfo:(nullable NSDictionary *)userInfo NS_AVAILABLE(10_6, 4_0) NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;@end

NSNotification顧名思義就是通知的作用,一個對象通知另外一個對象,可以用來傳遞參數、通信等作用,與delegate的一對一不同,通知是一對多的。在一個對象中注冊了通知,那么其他任意對象都可以來對這個對象發出通知。因為屬性都是只讀的,如果要創建消息時要用下面NSNotification (NSNotificationCreation)分類相應的方法進行初始化;

三:NSNotification (NSNotificationCreation)分類

@interface NSNotification (NSNotificationCreation)+ (instancetype)notificationWithName:(NSString *)aName object:(nullable id)anObject; + (instancetype)notificationWithName:(NSString *)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;- (instancetype)init /*NS_UNAVAILABLE*/; /* do not invoke; not a valid initializer for this class */@end

上面為初使化NSNotification對象,用于消息的發送對象;

?

?

?

最近有個妹子弄的一個關于擴大眼界跟內含的訂閱號,每天都會更新一些深度內容,在這里如果你感興趣也可以關注一下(嘿對美女跟知識感興趣),當然可以關注后輸入:github 會有我的微信號,如果有問題你也可以在那找到我;當然不感興趣無視此信息;

轉載于:https://www.cnblogs.com/wujy/p/5825690.html

總結

以上是生活随笔為你收集整理的你真的了解NSNotificationCenter吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久美女性网 | 成人综合站| 黑人精品无码一区二区三区 | www.中文字幕av | 青草视频在线观看视频 | 欧美精品一级在线观看 | 麻豆亚洲av成人无码久久精品 | 极品人妻一区二区三区 | 国产精品丝袜一区二区 | 伊人久久中文字幕 | 揄拍成人国产精品视频 | 午夜亚洲国产 | 红杏出墙记 | 精品久久久无码中文字幕 | 欧美日韩一区二区三区免费 | 青草视频免费在线观看 | 欧美巨大荫蒂茸毛毛人妖 | 一级片在线免费播放 | 亚洲中文一区二区三区 | 欧美成人黑人猛交 | 中国黄色免费网站 | 中文字幕亚洲在线 | 全部免费毛片在线播放 | 波多野结衣喷潮 | 操操操干干干 | 久久久精品一区 | 欧美激情 亚洲 | 欧美日韩一区二区三区在线观看 | 亚欧美色图 | 蘑菇福利视频一区播放 | 国产午夜精品久久 | 成人免费毛片aaaaaa片 | 中文字幕精品久久久久人妻红杏1 | 国产特黄一级片 | 中文字幕精品在线视频 | 日韩欧美一区二 | 九九免费在线视频 | 欧美成人精品一区二区男人小说 | 怡红院最新网址 | 992tv在线影院| 色欲国产精品一区二区 | 人妻天天爽夜夜爽一区二区三区 | 美女涩涩网站 | 日韩日b| 亚洲色图制服丝袜 | 可以直接看的毛片 | 成人a毛片 | 亚洲天堂8 | 激情六月综合 | 久久国产网| 国产h片在线观看 | 在线观看网站黄 | 精品视频网 | 日韩一级一区 | 伊人中文字幕在线观看 | 青青草一区 | 日本在线视频一区二区三区 | 做视频 | a级无遮挡超级高清-在线观看 | 欧美色图激情小说 | 又爽av| 草草地址线路①屁屁影院成人 | 久久国产色| 成人99| 久久人体视频 | 男人添女人荫蒂国产 | 国产成人综合在线视频 | 亚洲网站av | 18禁免费无码无遮挡不卡网站 | 嫩草国产 | 成人免费xxxxx在线视频 | 老熟女毛茸茸 | 亚洲精品小视频在线观看 | 国产学生美女无遮拦高潮视频 | 欧美日韩视频在线观看免费 | 欧美日韩在线第一页 | 国产亚洲精品久久久久久777 | 国产免费无码XXXXX视频 | 国产女人叫床高潮大片免费 | 久久98 | 4438全国最大成人网 | 日本一区二区人妻 | 香蕉久久精品 | 在线观看视频一区二区 | 欧美色图亚洲视频 | 爱情岛亚洲论坛入口 | 日日夜夜91 | 久久久久一区二区精码av少妇 | 黄色大片久久 | 国产呻吟av | 成年人黄网站 | 免费在线观看av网址 | 欧美丝袜脚交 | 色综合天 | av在线地址 | 国产一级性生活片 | 五月激情四射网 | 岛国在线视频 | 国产寡妇亲子伦一区二区三区四区 |