你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS 多播委托(GCDMulticastDelegate)

IOS 多播委托(GCDMulticastDelegate)

編輯:IOS開發綜合
在IOS中為了實現回調一般有如下幾個方法:   delegate 通知中心 block KVO(較特殊的回調,姑且也算一種) 以上四種中在我自己的項目中比較常用的就是delegate和block了。   在現實中回調的需求也分兩種   一對一的回調。 一對多的回調。 對於一對一的回調,在IOS中使用delegate、block都能實現。而一對多的回調基本就是通知中心了。       假如現在有一個需求,我們以圖片下載為例。這裡先忽略哪些SDWebimage等已經封裝好的第三方類庫。對於圖片下載一般的過程如下:   先判斷該圖片url是否已經下載完畢。如果已經下載完畢那麼直接回調顯示圖片。如果沒有下載那麼進入下載過程. 使用合適的圖片下載器下載圖片。 圖片下載完畢後回調顯示圖片。並且把該圖片存到緩存中。 這裡的難點是回調。如果一個頁面中有多個地方需要顯示同一張圖片,那麼勢必會發生這樣一種情況,就是同時有多個請求下載同意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賦值 }
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved