zoukankan      html  css  js  c++  java
  • iOS多播Delegate类——GCDMulticastDelegate用法小结

        iOS中通常的delegate模式只能有一个被委托的对象,这样当需要有多个被委托的对象时,实现起来就略为麻烦,在开源库XMPPFramework中提供了一个GCDMulticastDelegate类,使用它可以为一个对象添加多个被委托的对象,用起来也比较方便,用法简单小结如下:

        (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> *)[[GCDMulticastDelegatealloc] init];

          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];

    }

         多播的delegate与通常的delegate不同,multiDelegate并没有实现协议中的方法,而是将协议中的方法转发到自己delegate链中的对象。   对multiDelegate对象调用test1方法时,由于GCDMulticastDelegate没有实现test1方法,因此该类的forwardInvocation函数会被触发,在该函数中会遍历delegate链,对每一个delegate对象调用test1方法,从而实现了多个delegate。同时,在对multiDelegate调用协议方法时,采用的是异步的方式,协议方法会立刻返回,不会阻碍当前函数。

     

     

  • 相关阅读:
    转载:疯狂的XML扩展:GML、SVG、VML
    HDU 4274 Spy's Work [DFS]
    HDU 4279 Number [数学?]
    HDU 4276 The Ghost Blows Light [树形背包DP]
    HDU 3271 SNIBB [数位DP]
    HDU 4280 Island Transport [平面图网络流]
    HDU 4278 Faulty Odometer [进制转换]
    HDU 3058 Generator [AC自动机+期望DP]
    HDU 4277 USACO ORZ [状态压缩+枚举]
    HDU 4282 A very hard mathematic problem [枚举]
  • 原文地址:https://www.cnblogs.com/gugupluto/p/3673185.html
Copyright © 2011-2022 走看看