ios多播委托

在现实中回调的需求也分两种

  1. 一对一的回调。
  2. 一对多的回调。

对于一对一的回调,在IOS中使用delegate、block都能实现。而一对多的回调基本就是通知中心了。

假如现在有一个需求,我们以图片下载为例。这里先忽略哪些SDWebimage等已经封装好的第三方类库。对于图片下载一般的过程如下:

  1. 先判断该图片url是否已经下载完毕。如果已经下载完毕那么直接回调显示图片。如果没有下载那么进入下载过程.
  2. 使用合适的图片下载器下载图片。
  3. 图片下载完毕后回调显示图片。并且把该图片存到缓存中。

这里的难点是回调。如果一个页面中有多个地方需要显示同一张图片,那么势必会发生这样一种情况,就是同时有多个请求下载同一url的图片,并且下载完成后需要同时在多个地方显示图片。要是实现这样的需求,用现有的方案貌似很难解决。有的同学会想到通知中心,但是通知中心其实是一个广播服务,只要注册了接受该通知那么所有的注册者都能收到通知,但事实上我只需要在我需要下载的那个url的图片下载完后给出通知,而不需要所有的下载完毕事件都通知。这时候我们就需要多播委托了。

多播委托是指允许创建方法的调用列表或者链表的能力。当多播委托被调用时,列表中的方法均自动执行???(这句话我都读不懂)

如何在IOS中实现多播委托?老外早就已经写好了,而且相当的好用。我最初接触IOS多播委托是我在研究XMPPframework的时候,而多播委托可以说是XMPPframework架构的核心之一。具体的类名就是GCDMulticastDelegate,从名字就可以看出,这是一个支持多线程的多播委托。多个回调有可能不是在同一个线程的,比如我注册回调的时候是在后台线程,但是你回调的时候却在UI线程,那就有可能出问题了。因此必须保证你注册的时候在哪个线程上注册的,那么回调的时候必须还是在那个线程上回调的。

 

多播使用简介

(1)定义一个协议:

  @protocol MyDelegate

  @optional

  -(void)test;

  @end

(2)在需要使用delegate的类中定义一个GCDMulticastDelegate变量

  

  @interface ViewController : UIViewController

  {

        GCDMulticastDelegate<MyDelegate> *multiDelegate;

  }

(3)  定义多个实现了协议MyDelegate的类,如Object1和Object2;

(4)在需要使用delegate的地方使用如下代码,将多个被委托的对象,添加到multiDelegate的delegate链中。

  - (void)viewDidLoad

  {

     multiDelegate = (GCDMulticastDelegate <MyDelegate> *)[[GCDMulticastDelegateallocinit];

     Object1 *o1 = [[Object1 alloc]init];

     Object2 *o2 = [[Object2 alloc]init];

     [multiDelegate addDelegate:o1 delegateQueue:dispatch_get_main_queue()];

     [multiDelegate addDelegate:o2 delegateQueue:dispatch_get_main_queue()];

     [multiDelegate test1];

  }

posted @ 2016-05-04 14:50  程石亮  阅读(305)  评论(0编辑  收藏  举报