IOS訊息分發(廣播)機制

2021-06-29 09:23:29 字數 2776 閱讀 6935

在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.接收 接收主要有兩種方法 ...