美文网首页
GCDMulticastDelegate使用(多播委托)

GCDMulticastDelegate使用(多播委托)

作者: 落寞绅士 | 来源:发表于2022-11-19 11:49 被阅读0次

前言

在iOS开发中我们回调经常使用delegete、blcok、通知等方式。delegete和blcok都是“一对一”回调,通知可实现“一对多”回调。但是通知有两个明显的弊端:1、不好管理 2、传值只能在userInfo中,这就会导致传值类型不明确等问题。
有什么方式即可以“一对多”回调,又可以明确回调参数类型呢!答案是有的,就是我们今天介绍的GCDMulticastDelegate

1、GCDMulticastDelegate介绍

GitHub上的介绍:GCDMulticastDelegate extracted from XMPPFramework。
GCDMulticastDelegate是从XMPPFramework提取出来的,主要就是为了实现多播委托。

2、GCDMulticastDelegate导入

pod 'GCDMulticastDelegate'

但是如果我们项目中已经pod 'XMPPFramework'就无需单独pod 'GCDMulticastDelegate'了。因为XMPPFramework里面包含了GCDMulticastDelegate。

3、GCDMulticastDelegate使用

3.1、.h文件中
#import <Foundation/Foundation.h>
#import <GCDMulticastDelegate.h>

@protocol HLManagerDelegate<NSObject>
- (void)managerTestMethod;
@end
 
@interface HLManager : NSObject
{
    GCDMulticastDelegate<HLManagerDelegate> *_delegates;
}
+ (instancetype)sharedManager;
 
/// 添加代理
- (void)addDelegate:(id<HLManagerDelegate>)delegate delegateQueue:(dispatch_queue_t)queue;
/// 删除代理
- (void)removeDelegate:(id<HLManagerDelegate>)delegate;
@end
3.2、.m文件中
#import "HLManager.h"
 
static HLManager *manager = nil;
static NSObject *g_lock = nil;
@implementation HLManager
 
+ (instancetype)sharedManager
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[HLManager alloc] init];
    });
    return manager;
}
 
- (instancetype)init
{
    self = [super init];
    if (self) {
        _delegates = (GCDMulticastDelegate<HLManagerDelegate> *)[[GCDMulticastDelegate alloc] init];
        g_lock = [[NSObject alloc] init];
    }
    return self;
}

#pragma mark - Public Method
 
- (void)addDelegate:(id<HLManagerDelegate>)delegate delegateQueue:(dispatch_queue_t)queue
{
    @synchronized(g_lock) {
        if (!queue) {
            queue = dispatch_get_main_queue();
        }
        [_delegates addDelegate:delegate delegateQueue:queue];
    }
}
- (void)removeDelegate:(id<HLManagerDelegate>)delegate
{
    if (!delegate) {
        return;
    }
    @synchronized(g_lock) {
        [_delegates removeDelegate:delegate];
    }
}
@end

3.3、其他类使用HLManagerDelegate
- (void)viewDidLoad {
    [super viewDidLoad];
    
    [[HLManager sharedManager] addDelegate:self delegateQueue:dispatch_get_main_queue()];
}

- (void)dealloc {
    [[HLManager sharedManager] removeDelegate:self];
}
 
#pragma mark - HLManagerDelegate
 
- (void)managerTestMethod
{
    NSLog("调用了managerTestMethod方法");
}

4、总结

上面简单演示了GCDMulticastDelegate简单使用。希望对您有帮助!

参考:
GCDMulticastDelegate使用

相关文章

  • GCDMulticastDelegate使用(多播委托)

    前言 在iOS开发中我们回调经常使用delegete、blcok、通知等方式。delegete和blcok都是“一...

  • Delegate - 高级用法之多播委托

    iOS多播Delegate类——GCDMulticastDelegate用法小结 iOS 多播委托(GCDMult...

  • 多播委托与匿名方法、Lambda表达式

    委托可以包含多个方法,这种委托叫做多播委托。 多播委托写法如下: public void Test1(){ Con...

  • 多播委托

    public static void text1(){Console.WriteLine("text1");}pu...

  • 24、多播委托

    1. 定义: 让一个委托指向多个方法 1. 给委托增加一个方法 a+= function 2. 给委托去掉一个方...

  • iOS 多播委托

    iOS回调有Delegate,NSNotificationCenter,block,kvo。但是项目中回调 有种情...

  • 多播委托与委托小总结

    多播委托中的方法调用的顺序与增加方法时的顺序是一致的。 多播委托中,如果其中的某个方法执行发生了异常,后面的方法不...

  • C#委托内部实现

    认知尚浅,如有错误,愿闻其详! 我们先看以下的代码,代码中实现了多播委托:静态方法委托: 实例方法委托: PS:多...

  • Multicast Delegates 多播委托

    意义解释:一个委托包含多个方法 A delegate that wraps more than one metho...

  • 30号c#总结

    30号 委托与事件,这一节主要分四个部分,委托的理解,接口的成员,多播委托,事件。 委托的定义语,[访问修饰符] ...

网友评论

      本文标题:GCDMulticastDelegate使用(多播委托)

      本文链接:https://www.haomeiwen.com/subject/ggrbxdtx.html