IOS 多播委託(GCDMulticastDelegate),iosdelegate

來源:互聯網
上載者:User

IOS 多播委託(GCDMulticastDelegate),iosdelegate

在IOS中為了實現回調一般有如下幾個方法:

以上四種中在我自己的項目中比較常用的就是delegate和block了。

在現實中回調的需求也分兩種

對於一對一的回調,在IOS中使用delegate、block都能實現。而一對多的回調基本就是通知中樞了。

 

假如現在有一個需求,我們以圖片下載為例。這裡先忽略哪些SDWebimage等已經封裝好的第三方類庫。對於圖片下載一般的過程如下:

這裡的痛點是回調。如果一個頁面中有多個地方需要顯示同一張圖片,那麼勢必會發生這樣一種情況,就是同時有多個請求下載同意url的圖片,並且下載完成後需要同時在多個地方顯示圖片。要是實現這樣的需求,用現有的方案貌似很難解決。有的同學會想到通知中樞,但是通知中樞其實是一個廣播服務,只要註冊了接受該通知那麼所有的註冊者都能收到通知,但事實上我只需要在我需要下載的那個url的圖片下載完後給出通知,而不需要所有的下載完畢事件都通知。這時候我們就需要多播委託了。

什麼是多播委託?我直接拿其他部落格上的一個定義來解釋。簡單地說,多播委託是指允許建立方法的調用列表或者鏈表的能力。當多播委託被調用時,列表中的方法均自動執行

在IOS中我就以我們平常用的最多的delagate為例,普通的delegate只能是一對一的回調,無法做到一對多的回調。而多播委託正式對delegate的一種擴充和延伸,多了一個註冊和取消註冊的過程,任何需要回調的對象都必須先註冊。

如何在IOS中實現多播委託?老外早就已經寫好了,而且相當的好用。我最初接觸IOS多播委託是我在研究XMPPframework的時候,而多播委託可以說是XMPPframework架構的核心之一。具體的類名就是GCDMulticastDelegate,從名字就可以看出,這是一個支援多線程的多播委託。那為什麼要支援多線程呢?我的理解是多個回調有可能不是在同一個線程的,比如我註冊回調的時候是在後台線程,但是你回調的時候卻在UI線程,那就有可能出問題了。因此必須保證你註冊的時候在哪個線程上註冊的,那麼回調的時候必須還是在那個線程上回調的。

下面我講解寫多播委託在IOS中的用法。

我先舉個例子,比如有一個UserInfo(有一個userName的屬性)的類,頁面上有三個lable和一個按鈕,當點擊按鈕的時候給userInfo的userName屬性賦值,這時候三個lable同時顯示userInfo的userName屬性的值。

針對以上過程,我們需要對每個lable向userInfo執行個體註冊,也就是向多播委託註冊。當對userInfo的userName賦值的時候調用多播委託的方法,這裡也就是調用setText方法。這樣就能實現上面的需求了。

用代碼錶示就是:

//繼承自多播委託基類的userInfo類@interface UserInfo : MulticastDelegateBaseObject@property (nonatomic,strong)NSString *userName;@end@implementation UserInfo-(void)setUserName:(NSString *)userName{    _userName=userName;    [multicastDelegate setText:userName];//調用多播委託}@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];    [userInfo addDelegate:lable delegateQueue: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];    [btn addTarget:self action:@selector(btnCLicked:) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:btn];    }-(void)btnCLicked:(UIButton *)btn{    userInfo.userName=@"123456";//給userInfo賦值}

 

原始碼點擊下載

 


iOS 怎設定委託

你要設定哪種委託?控制項觸發事件的委託還是協議委託?
 
ios中協議與委託(protocol、delegate)的使用方法

一般最常用的就是不同的對象調用,需要回調處理的時候 都用協議處理~
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.