關(guān)于XMPPFramwork中使用的多播代理

在IOS中為了實現(xiàn)回調(diào)一般有如下幾個方法:

  1. delegate
  2. NSNotification
  3. block
    4 .KVO

以上四種中在我自己的項目中比較常用的就是delegate和block了奴愉。
在現(xiàn)實中回調(diào)的需求也分兩種
一對一的回調(diào)把夸。
一對多的回調(diào)。

對于一對一的回調(diào)翩剪,在IOS中使用delegate七婴、block都能實現(xiàn)祟偷。而一對多的回調(diào)基本就是通知中心了。

假如現(xiàn)在有一個需求打厘,我們以圖片下載為例修肠。這里先忽略哪些SDWebimage等已經(jīng)封裝好的第三方類庫。對于圖片下載一般的過程如下:
先判斷該圖片url是否已經(jīng)下載完畢户盯。如果已經(jīng)下載完畢那么直接回調(diào)顯示圖片嵌施。如果沒有下載那么進入下載過程.
使用合適的圖片下載器下載圖片。
圖片下載完畢后回調(diào)顯示圖片莽鸭。并且把該圖片存到緩存中吗伤。

這里的難點是回調(diào)。如果一個頁面中有多個地方需要顯示同一張圖片硫眨,那么勢必會發(fā)生這樣一種情況足淆,就是同時有多個請求下載同意url的圖片,并且下載完成后需要同時在多個地方顯示圖片。要是實現(xiàn)這樣的需求缸浦,用現(xiàn)有的方案貌似很難解決夕冲。有的同學(xué)會想到通知中心,但是通知中心其實是一個廣播服務(wù)裂逐,只要注冊了接受該通知那么所有的注冊者都能收到通知歹鱼,但事實上我只需要在我需要下載的那個url的圖片下載完后給出通知,而不需要所有的下載完畢事件都通知卜高。這時候我們就需要多播委托了弥姻。
什么是多播委托?我直接拿其他博客上的一個定義來解釋掺涛。簡單地說庭敦,多播委托是指允許創(chuàng)建方法的調(diào)用列表或者鏈表的能力。當多播委托被調(diào)用時薪缆,列表中的方法均自動執(zhí)行
在IOS中我就以我們平常用的最多的delagate為例秧廉,普通的delegate只能是一對一的回調(diào),無法做到一對多的回調(diào)拣帽。而多播委托正式對delegate的一種擴展和延伸疼电,多了一個注冊和取消注冊的過程,任何需要回調(diào)的對象都必須先注冊减拭。
如何在IOS中實現(xiàn)多播委托?老外早就已經(jīng)寫好了蔽豺,而且相當?shù)暮糜谩N易畛踅佑|IOS多播委托是我在研究XMPPframework的時候拧粪,而多播委托可以說是XMPPframework架構(gòu)的核心之一修陡。具體的類名就是GCDMulticastDelegate,從名字就可以看出可霎,這是一個支持多線程的多播委托魄鸦。那為什么要支持多線程呢?我的理解是多個回調(diào)有可能不是在同一個線程的,比如我注冊回調(diào)的時候是在后臺線程啥纸,但是你回調(diào)的時候卻在UI線程号杏,那就有可能出問題了婴氮。因此必須保證你注冊的時候在哪個線程上注冊的斯棒,那么回調(diào)的時候必須還是在那個線程上回調(diào)的。
下面我講解寫多播委托在IOS中的用法主经。
我先舉個例子荣暮,比如有一個UserInfo(有一個userName的屬性)的類,頁面上有三個lable和一個按鈕罩驻,當點擊按鈕的時候給userInfo的userName屬性賦值穗酥,這時候三個lable同時顯示userInfo的userName屬性的值。
針對以上過程,我們需要對每個lable向userInfo實例注冊砾跃,也就是向多播委托注冊骏啰。當對userInfo的userName賦值的時候調(diào)用多播委托的方法,這里也就是調(diào)用setText方法抽高。這樣就能實現(xiàn)上面的需求了判耕。
用代碼表示就是:

//繼承自多播委托基類的userInfo類
@interface UserInfo : MulticastDelegateBaseObject
@property (nonatomic,strong)NSString *userName;
@end

@implementation UserInfo
-(void)setUserName:(NSString *)userName{ 
       _userName=userName;
       [multicastDelegate setText:userName];//調(diào)用多播委托}
@end

- (void)viewDidLoad { 
[super viewDidLoad];
 // Do any additional setup after loading the view, typically from a nib.//初始化一個userinfo的實例 
userInfo=[[UserInfo alloc] init]; 
//添加一個lable
 UILabel *lable =[[UILabel alloc] initWithFrame:CGRectMake(0, 20, 100, 30)]; lable.backgroundColor=[UIColor blueColor]; 
lable.textColor=[UIColor blackColor]; [userInfoaddDelegate:labledelegateQueue:dispatch_get_main_queue()];//向多播委托注冊
 [self.view addSubview:lable];
 
lable =[[UILabel alloc] initWithFrame:CGRectMake(0, 60, 100, 30)]; lable.backgroundColor=[UIColor blueColor];
 
lable.textColor=[UIColor blackColor];

 [userInfo addDelegate:lable delegateQueue:dispatch_get_main_queue()];
 [self.view addSubview:lable];
 lable =[[UILabel alloc] initWithFrame:CGRectMake(0, 100, 100, 30)]; lable.backgroundColor=[UIColor blueColor]; 
lable.textColor=[UIColor blackColor]; 
[userInfo addDelegate:lable delegateQueue:dispatch_get_main_queue()];
 [self.view addSubview:lable]; //添加一個按鈕

 UIButton *btn=[[UIButton alloc] initWithFrame:CGRectMake(200, 20, 100, 50)];
 [btn setBackgroundColor:[UIColor blueColor]];
 [btn setTitle:@"button1" forState:UIControlStateNormal];
 [btnaddTarget:selfaction:@selector(btnCLicked:)forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn]; 

}
-(void)btnCLicked:(UIButton *)btn{ 
userInfo.userName=@"123456";//給userInfo賦值
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市翘骂,隨后出現(xiàn)的幾起案子壁熄,更是在濱河造成了極大的恐慌,老刑警劉巖碳竟,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件草丧,死亡現(xiàn)場離奇詭異,居然都是意外死亡莹桅,警方通過查閱死者的電腦和手機昌执,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诈泼,“玉大人仙蚜,你說我怎么就攤上這事〕Ш梗” “怎么了委粉?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娶桦。 經(jīng)常有香客問我贾节,道長,這世上最難降的妖魔是什么衷畦? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任栗涂,我火速辦了婚禮,結(jié)果婚禮上祈争,老公的妹妹穿的比我還像新娘斤程。我一直安慰自己,他們只是感情好菩混,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布忿墅。 她就那樣靜靜地躺著,像睡著了一般沮峡。 火紅的嫁衣襯著肌膚如雪疚脐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天邢疙,我揣著相機與錄音棍弄,去河邊找鬼望薄。 笑死,一個胖子當著我的面吹牛呼畸,可吹牛的內(nèi)容都是我干的痕支。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蛮原,長吁一口氣:“原來是場噩夢啊……” “哼采转!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞬痘,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤故慈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后框全,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體察绷,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年津辩,在試婚紗的時候發(fā)現(xiàn)自己被綠了拆撼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡喘沿,死狀恐怖闸度,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚜印,我是刑警寧澤莺禁,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站窄赋,受9級特大地震影響哟冬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忆绰,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一浩峡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧错敢,春花似錦翰灾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至峰锁,卻和暖如春萎馅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虹蒋。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工糜芳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魄衅。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓峭竣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晃虫。 傳聞我的和親對象是個殘疾皇子皆撩,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容