在ios中,提供了通知機制(notification),可以在物件間傳遞和接受資訊。傳遞和接受資訊的物件間甚至不需要知道對方的存在。究其本質來說,其實是設計模式中的觀察者模式的應用。
一種更好的方式,就是使用ios中的notification機制。
notification由三部分組成:傳送訊息者、訊息中心(負責接送及**訊息)、訊息訂閱者三個部分。他們的關係如下圖所示:
如圖所示,notification機制的流程為:
1、訊息發出者(sender)與訊息接受者(observer)通過notification center建立關係,sender和observer之間互相不知道對方的存在。
2、observer向notification center註冊感興趣的訊息(同乙個訊息可以被多次註冊,這樣observer會多次得到相同的訊息通知)。
3、sender向notification center傳送訊息。
4、notification center接收到來自sender訊息,自動根據註冊資訊向感興趣的observer**訊息。
5、observer獲得來自notification center的訊息處理。
[objc]view plain
copy
-(bool):(
openurl
:(nsurl
*)url
:(nsstring
annotation
:(id
)annotation
上面的處理中,有這麼幾點:
2、我們向notification center傳送訊息,呼叫了postnotificationname:object:方法。其實在該方法中,我們同時建立了乙個notification物件,該方法會將該訊息物件傳送到notification center中。(其實我們也可以先建立乙個notification物件,再通過呼叫方法傳送該物件,但是現在使用的方法更簡潔)
在ios中,訊息也是乙個物件的形式存在的,其有三個屬性如下:
[objc]view plain
copy
@inte***ce
nsnotification : nsobject
@property
(readonly
, copy
) nsstring
*name;
// 訊息名稱
@property
(readonly
, retain
) id
object;
// 訊息附加的物件資訊
@property
(readonly
, copy
) nsdictionary
*userinfo;
// 訊息附加的使用者自定義擴充套件資訊
上面三個屬性的具體內容都是由sender定義的,其中name可以讓我們區別是什麼訊息,而object和userinfor則可以附帶一些訊息發出時的附加資訊供訊息接受者處理。(object屬性通常會設定為訊息發出者自身self,這樣observer就可以通過訂閱時指定name 和 object屬性來確定感興趣的訊息,並指定其來自那個object)。
3、observer註冊感興趣的訊息到notification center,並指明處理訊息的selector或塊。
這裡,在viewcontroller的viewdidload中,我註冊了感興趣的通知,openpdf。並指明處理的selector為openpdfaction:
[objc]view plain
copy
- (void
)viewdidload
在訂閱訊息函式中,我們並沒有指定要訂閱那個object,所以不管是那個sender的訊息,只要名字等於openpdf,則notification center就會通知我們,並呼叫我們的處理函式openpdfaction。
4、處理函式的定義一般如下,其引數僅有乙個,就是被**過來的notification物件,同時,沒有返回值(因為乙個訊息可能會被**至多個observer,對於返回值來說就沒有必要了,否則,你應使用那個處理函式的返回值呢?)
[objc]view plain
copy
-(void
)openpdfaction
:(nsnotification*) sender
} ok,這樣我們就完成了乙個訊息的處理流程了:sender發出訊息到notification center,observer 註冊感興趣的訊息到notification center,notification center在有訊息時,會自動將訊息傳送給感興趣的observer。在這個流程中,sender和observer始終不知道對方的存在,他們是通過notification center建立聯絡的。
2、利用nsnotificationcenter物件分發notification是同步的,即直到所有的observer均接收到訊息並處理完成後,呼叫訊息分發的函式才會返回。若想非同步處理訊息分發,可以借助notification queues(乙個為nsnotificationcenter對像配備的訊息快取)。
若要實現訊息的跨執行緒分發,一種方法是可以實現自定義的訊息緩衝(不是系統的nsnotificationqueue物件),讓其在正確的執行緒上接受訊息,然後再像目標執行緒**訊息。
iOS訊息機制基於廣播模型
ios訊息機制基於廣播模型 訊息中心 nsnotificationcenter 是基於程序的單件例項 訊息佇列 nsnotificationqueue 是基於執行緒的,每個執行緒都有乙個預設的訊息佇列,這個佇列相關聯於訊息中心,每個訊息中心或執行緒可以關聯於多個佇列。訊息中心是採用同步方式 訊息佇列...
IOS 廣播機制與 android 廣播機制對比
android下廣播機制的實現機制 1.傳送 context的 sendbroadcast實現,傳入intent即可,intent提供了攜帶很多基本型別等的方法,如果想傳遞複雜物件,應該實現parcelable介面,parcelable介面提供了物件序列化的一系列方法。2.接收 接收主要有兩種方法 ...
IOS 廣播機制與 android 廣播機制對比
android下廣播機制的實現機制 1.傳送 context的 sendbroadcast實現,傳入intent即可,intent提供了攜帶很多基本型別等的方法,如果想傳遞複雜物件,應該實現parcelable介面,parcelable介面提供了物件序列化的一系列方法。2.接收 接收主要有兩種方法 ...