美文网首页
实现多代理(消息转发)

实现多代理(消息转发)

作者: 寂寞先森666 | 来源:发表于2019-11-02 15:07 被阅读0次

需求:创建一个单例person,要求person上的更新内容在vc1、vc2实时变化

#import <Foundation/Foundation.h>
#import "MultiDelegate.h"


@protocol personDelegate <NSObject>
-(void)eating;
@end

@interface person : NSObject
+(instancetype)share;
@property(strong,nonatomic) MultiDelegate <personDelegate> * delegate;
@end
#import "person.h"
@interface person()
@property(strong,nonatomic)NSTimer * timer;
@end
@implementation person
+ (instancetype)share
{
    static person * p = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (p == nil) {
            p = [[person alloc]init];
            p.delegate = [[MultiDelegate alloc]init];
            p.timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
                [p.delegate eating];
            }];
        }
    });
    return p;
}
@end

创建MultiDelegate

#import <Foundation/Foundation.h>

@interface MultiDelegate : NSObject

- (void)addDelegate:(id)delegate;

@end
#import "MultiDelegate.h"
@interface MultiDelegate()
@property(strong,nonatomic)NSMutableArray * delegates;
@end
@implementation MultiDelegate

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.delegates = [NSMutableArray array];
    }
    return self;
}
- (void)addDelegate:(id)delegate {
    [self.delegates addObject:delegate];
}
//返回方法签名
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
    NSMethodSignature * signature;
    for (id delegate in self.delegates) {//存储了各个对象的代理
        signature = [delegate methodSignatureForSelector:selector];
        if (signature)
        {
            break;
        }
    }
    return signature;
}
//找到真正的消息接受者
- (void)forwardInvocation:(NSInvocation *)invocation {
    SEL selector = [invocation selector];
    for (id delegate in self.delegates) {//遍历存储给个对象的代理,发送给每个要实现代理方法的对象
        if (delegate && [delegate respondsToSelector:selector]) {
            //触发方法调用
            [invocation invokeWithTarget:delegate];
        }
    }
}

@end

在vc1、vc2中使用

vc1

- (void)viewDidLoad {
    [super viewDidLoad];
    [[person share].delegate addDelegate:self];
}
-(void)eating
{
    NSLog(@"vc1 eating...");
}

vc2

- (void)viewDidLoad {
    [super viewDidLoad];
    [[person share].delegate addDelegate:self];
}
-(void)eating
{
    NSLog(@"vc2 eating...");
}

打印结果
2019-08-30 14:30:28.119098+0800 yyModel测试[23455:763215] vc1 eating...
2019-08-30 14:30:28.119306+0800 yyModel测试[23455:763215] vc2 eating...
2019-08-30 14:30:29.119138+0800 yyModel测试[23455:763215] vc1 eating...
2019-08-30 14:30:29.119496+0800 yyModel测试[23455:763215] vc2 eating...

相关文章

  • 实现多代理(消息转发)

    需求:创建一个单例person,要求person上的更新内容在vc1、vc2实时变化 创建MultiDelegat...

  • iOS 文本输入控制(献上框架)

    博客更新日志 2018年3月16日 更新:消息转发逻辑,放弃了之前的代理方法转发方式,改用方法重定向实现多代理消息...

  • ios开发-NSProxy

    作用:与NSObject属同一个级别,负责将消息转发到真正的target的代理类,实现类似于多继承的功能。 打个比...

  • iOS 多代理的实现

    iOS多代理实现 XMPP以及类似IM框架里通常会有这种需求:打开多个聊天窗口,和多个人聊天。然鹅框架底层消息转发...

  • NSProxy

    概念 NSProxy是一个实现NSObject协议的根类 使用 恰如其名,作为代理使用,通过消息转发实现 e.g....

  • 消息转发与关联类

    消息转发分为快速消息转发和完全消息转发,实现了多重继承的功能。 Objective并不实现多重继承的功能。只能实现...

  • iOS解耦方案

    解耦方案是针对AppDelegate,通过消息的转发、GCDMulticastDelegate代理的一对多模式来实...

  • ios 将代理方法组件化(消息转发,多代理)

    在工作的过程中,我们经常会遇到一些需求是这样的:限制textField的输入字数上限,且只允许输入数字;反复使用同...

  • Java中的静态代理和动态代理

    什么是代理 代理是设计模式的一种,代理类为委托类提供消息预处理,消息转发,事后消息处理等功能。Java中的代理分为...

  • springboot常用starter⑫-rabbitmq

    rabbitmq RabbitMQ 是部署最广泛的开源消息代理RabbitMQ 是一个消息代理:它接受和转发消息您...

网友评论

      本文标题:实现多代理(消息转发)

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