1. 程式人生 > >關於iOS中的通知中心(NSNotificationCenter)

關於iOS中的通知中心(NSNotificationCenter)

先說一下什麼叫通知:
iOS中的通知機制又叫訊息機制,其包括2類:一類是本地通知;另一類是推送通知,也叫遠端通知.兩種通知在iOS中的表現一致,可以通過橫幅或者彈出提醒兩種形式告訴使用者,並且點選通知可以開啟應用程式,但是兩種通知的實現原理卻完全不同.

那麼什麼是通知中心呢:
對於初學者,往往會把iOS中的本地通知,推送通知和iOS通知中心的概念弄混.其實二者之間並沒有任何關係,事實上它們都不屬於一個框架,前者屬於UIKit框架,後者屬於Foundation框架.

通知中心實際上是iOS程式內部之間的一種訊息廣播機制,主要為了解決應用程式內部不同物件之間解耦而設計.它是基於觀察者模式設計的,不能跨應用程式程序進行通訊,當通知中心接收到訊息之後會根據內部的訊息轉發表,將訊息傳送給訂閱者.下面是一個簡單的流程示意圖:

通知中心和協議代理等傳值有什麼區別:
如果我們現在好幾個介面又要傳遞同一個值,也就是說我們當前這個介面都要得到另一個介面給它傳值,用代理的話那我們shi’b是不是要把那些介面都要實現本介面都要實現本介面的協議才能取到值?這是效率非常低下的一種做法,要實現資料一對多的情況下,通知中心是一個很好的解決方案.
上圖中黃色的線代表addObserver也就是新增觀察者,當資料發生改變的時候通過紫色的線也就是postNotification傳送通知,當我們的通知中心傳送了通知的時候,所有的addObserver都能接收到通知.

瞭解通知中心需要熟悉NSNotificationCenter和NSNotification兩個類:

NSNotificationCenter:是通知系統的中心,用於註冊和傳送通知,下表列出常用的方法。

方法1
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject
說明:
新增監聽,引數:
observer:監聽者
selector:監聽方法(監聽者監聽到通知後執行的方法)
name:監聽的通知名稱
object:通知的傳送者(如果指定nil則監聽任何物件傳送的通知)

方法2
- (id )addObserverForName:(NSString )name object:(id)obj queue:(NSOperationQueue

)queue usingBlock:(void (^)(NSNotification *note))block
說明:
新增監聽,引數:
name:監聽的通知名稱
object:通知的傳送者(如果指定nil則監聽任何物件傳送的通知)
queue:操作佇列,如果制定非主隊執行緒佇列則可以非同步執行block
block:監聽到通知後執行的操作

方法3
- (void)postNotification:(NSNotification *)notification
說明:
傳送通知,引數:
notification:通知物件

方法4
- (void)postNotificationName:(NSString *)aName object:(id)anObject
說明:
傳送通知,引數:
aName:通知名稱
anObject:通知傳送者

方法5
- (void)postNotificationName:(NSString )aName object:(id)anObject userInfo:(NSDictionary )aUserInfo
說明:
傳送通知,引數:
aName:通知名稱
anObject:通知傳送者
aUserInfo:通知引數

方法6
- (void)removeObserver:(id)observer
說明:
移除監聽,引數:
observer:監聽物件

方法7
- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject
說明:
移除監聽,引數:
observer:監聽物件
aName:通知名稱
anObject:通知傳送者

NSNotification:代表通知內容的載體,主要有三個屬性:name代表通知名稱,object代表通知的傳送者,userInfo代表通知的附加資訊。

通知中心的使用很簡單,只需要註冊通知和傳送通知

1.註冊通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mytest:) name:@“myTest” object:nil];

2.傳送通知
[[NSNotificationCenter defaultCenter] postNotificationName:@“myTest” object:nil userInfo:@{}];

首先我們是在源資料頁面傳送通知,將需要傳遞的值寫進userInfo中,並給它一個key(後面需要通過這個key取值)

在我們需要取到數值的頁面註冊通知,我們可以在mytest的實現方法中取值

例如:在源資料頁面有這樣的程式碼

[[NSNotificationCenter defaultCenter] postNotificationName:@"categoryDidChanged" object:nil userInfo:@{@"categoryModel":_selectedModel}];

[[NSNotificationCenter defaultCenter] postNotificationName:@"categoryDidChanged" object:nil userInfo:@{@"subCategoryName":subArr[row]}];

其中,_selectedModel和subArr[row]就是我們需要傳遞的值,傳送通知可以傳送多次,通過不同的key儲存資料

在我們需要取值的控制器的viewDIdLoad中,這樣寫:

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

注意:兩次的name要一致,然後我們寫@selector實現方法

- (void)categoryChange:(NSNotification *)noti{

   CategoriyModel *model =noti.userInfo[@"categoryModel"];
    NSLog(@"%@", model.name);
    NSString *str = noti.userInfo[@"subCategoryName"];
    NSLog(@"%@", str);
}

這裡我們註冊通知只進行一次,我們可以根據不同的key取得我們之前傳送的不同的值,方便快捷

如果我們有不同的name傳送的通知,我們也需要註冊兩次通知,同樣的寫兩個方法,進行兩次不同的傳值,根據不同的需求我們可以設定多個通知,通知可以全域性方便快捷的傳值

相關推薦

iOS通知中心NSNotificationCenter應用總結

iOS中通知中心NSNotificationCenter應用總結 一、瞭解幾個相關的類 1、NSNotification 這個類可以理解為一個訊息物件,其中有三個成員變數。 這個成員變數是這個訊息物件的唯一標識,用於辨別訊息物件。 @property (readonly, cop

iOS通知中心(NSNotificationCenter)的使用總結

轉載自:https://my.oschina.net/u/2340880/blog/406163 摘要: NSNotification是IOS中一個排程訊息通知的類,採用單例模式設計,在程式中實現傳值、回撥等地方應用很廣。 iOS中通知中心NSNotificatio

關於iOS通知中心(NSNotificationCenter)

先說一下什麼叫通知: iOS中的通知機制又叫訊息機制,其包括2類:一類是本地通知;另一類是推送通知,也叫遠端通知.兩種通知在iOS中的表現一致,可以通過橫幅或者彈出提醒兩種形式告訴使用者,並且點選通知可以開啟應用程式,但是兩種通知的實現原理卻完全不同. 那麼

iOS 通知中心 NSNotificationCenter(訊息機制)

今天專案要用到NSNotificationCenter,我喜歡叫它訊息(有的地方叫通知)。前兩天有弄過訊息推送,所以想對不瞭解的人解釋一下,ios訊息推送與這個訊息不是一回事!(我感覺他倆名字有的相似,怕有人誤會) 因為本人菜鳥一枚,所以之前弄過一次這個。但是今天要用的時候

iOS 通知中心 NSNotificationCenter & NSNotification

通知中心是 Foundation 框架的一個子系統,它嚮應用程式中註冊為某個事件觀察者的所有物件廣播訊息(即通知)。(從程式設計角度而言,它是 NSNotificationCenter 類的例項)。該事件可以是發生在應用程式中的任何事情,例如進入後臺狀態,或者使用者開始在文

iOS 清除通知中心收到的APNS通知

下面內容轉載自:http://blog.csdn.net/zzzzzdddddxxxxx/article/details/42265393 我在測試的時候用的第一個方法就搞定了 從通知中心移除通知的三種方法: 1.將app的BadgeNumber設為0,就是ap

iOS開發:NSNotificationCenter通知中心的使用

        在開發過程中,使用通知的地方還是很多的,通知中心(NSNotificationCenter)實際上上一個訊息通知機制,是在程式內部提供的一種廣播機制。舉一個經典的應用場景:任意物件可以傳送通知到中心,同時任意物件也可以監聽中心傳送的通知。也就是說,把接收到的

iOS Block傳值、代理傳值、通知中心

  Joker_King  關注 2016.04.18 22:17*  字數 802  閱讀 1792 評論 7 喜歡 12 在我們需

ios-通知中心原理

關於通知中心,我們應該都去發過通知以及去監聽這個通知,我們下面就做一個簡單的探析。首先我們可以先通過打斷點的方式去po [NSNotificationCenter defaultCenter]去檢視它的資訊,我們會發現有很多系統的通知在裡面,在裡面我們可以找到我們釋出的通知。

IOS使用本地通知(UILocalNotification)刪除應用角標小紅點不刪除通知中心內容

1.本地通知需要當應用在後臺時執行,比如放在applicationDidEnterBackground方法裡; 2.需要註冊通知 - (BOOL)application:(UIApplication

IOS通知--操作表ActionSheet和警報AlertView

轉自holydancer的CSDN專欄,原文地址:http://blog.csdn.net/holydancer/article/details/7404302 今天介紹兩種控制元件,用來向用戶提供通知並供選擇,ActionSheet從底部彈出,可以顯示一系列的按鈕,

swift通知的使用

lin ont view selector load pan span 處的 ext ios討論群1群:135718460 1.發通知。(以這條通知為例,通知名字:gameOverNotification。通知參數:title) NSNotificationCent

iOSUDP的使用

ios receive str add rec void enc array 區分 // // ViewController.m // UDPDemo // // Created by qianfeng01 on 15-8-13. // Copyright (c

IOS公布應用程序,進度條一直不走怎麽處理

sso pan arch 技術分享 成功 csdn 版本 進度條 div 在IOS中公布應用程序非常是喜聞樂見。近期1周。我更新了6次版本號。可是時不時的會卡住,進度條不走。最後總結了幾個原因。 1.在公布前你要確認自己的證書是否配置正確 2.DNS域名server有沒

小胖說事28------iOSextern,static和const差別和使用方法

方法 string 文件 only 聲明 sans nbsp ring const 通俗的講: extern字段使用的時候,聲明的變量為全局變量,都能夠調用,也有這樣一種比較狹義的說法:extern能夠擴展一個類中的變量到還有一個類中;

iOS.pch文件怎樣使用

water csdn 例如 popu p s 老版本 tex content data- pch 能夠用來存儲共享信息,比方設備屏幕的寬度,高度。版本等等 公用信息 Xcode 老版本號會自己主動為我們創建pch文件,新版本號開始不自己主動創建了。假設須要使用能夠自己手

從deque到std::stack,std::queue,再到iOS NSArray(CFArray)

blog image nis get 容器 view 緩沖 div n-1 從deque到std::stack,std::queue,再到iOS 中NSArray(CFArray) deque deque雙端隊列,分段連續空間數據結構,由中控的map(與其說map,不

iOS 刪除cookie的正確做法

nbsp -h ring html tpc bold normal dom http 需求:刪除 qq 登錄的 cookie,保證下次打開 qq 登錄頁面不會默認登錄 實現: NSString *url =@"https://w.mail.qq.com

iOS 地圖移動中心點獲取

content 移動 overlay release reg ota popu top from MKMap顯示地圖後,假設用戶移動了地圖。自定義的數據就須要刷新了。所以這個時候。中心點的經緯度就比較重要了。 本文演示怎樣獲取經緯度

iOS 最新支付寶支付(AliPay) 韓俊強的博客

urlencode init 易用 微軟雅黑 per 回調 process class lis 每日更新關註:http://weibo.com/hanjunqiang 新浪微博 如今的支付方式一般有三種, 支付寶, 微信, 網銀. 個人認為最簡單易用的還是支付寶