跳到主要内容

简述利用Runtime实现的target-action方式(CTMediator) ?

参考答案:

target-action 是一种常见的事件处理机制,在 iOS 开发中,经常用于处理按钮点击、滑动等 UI 事件。Runtime 是 Objective-C 的运行时环境,它提供了一套强大的动态消息派发机制,可以让我们在运行时为类添加方法、交换方法实现等。

CTMediator 作为一个中间件的实现,可以看作是一个消息转发中心,用于将不同组件或模块之间的通信解耦。结合 Runtimetarget-action 机制,我们可以实现一个灵活且可扩展的消息分发系统。

以下是利用 Runtime 实现的 target-action 方式(类似 CTMediator)的基本步骤:

  1. 定义协议:首先,定义一个协议,用于规定响应事件的方法签名。
@protocol CTActionProtocol <NSObject>
- (void)performActionWithParameter:(id)parameter;
@end
  1. 注册事件:提供一个注册事件的方法,允许其他对象将自己作为目标(target)和对应的方法(action)注册到消息中心。
@interface CTMediator : NSObject
+ (void)registerTarget:(id<CTActionProtocol>)target action:(SEL)action forEvent:(NSString *)event;
@end

@implementation CTMediator

static NSMutableDictionary<NSString *, NSMutableDictionary<id<CTActionProtocol>, SEL> *> *registeredEvents = [NSMutableDictionary dictionary];

+ (void)registerTarget:(id<CTActionProtocol>)target action:(SEL)action forEvent:(NSString *)event {
    NSMutableDictionary<id<CTActionProtocol>, SEL> *targetActions = registeredEvents[event];
    if (!targetActions) {
        targetActions = [NSMutableDictionary dictionary];
        registeredEvents[event] = targetActions;
    }
    targetActions[target] = action;
}

@end
  1. 触发事件:当某个事件发生时,消息中心遍历所有注册了该事件的 target-action 对,并调用它们的方法。
+ (void)triggerEvent:(NSString *)event withParameter:(id)parameter {
    NSMutableDictionary<id<CTActionProtocol>, SEL> *targetActions = registeredEvents[event];
    if (targetActions) {
        for (id<CTActionProtocol> target in targetActions.allKeys) {
            SEL action = targetActions[target];
            if ([target respondsToSelector:action]) {
                [target performSelector:action withObject:parameter];
            }
        }
    }
}
  1. 使用示例:其他对象可以遵循 CTActionProtocol 协议,并实现 performActionWithParameter: 方法。然后,它们可以使用 CTMediator 的类方法注册自己为某个事件的响应者。当事件被触发时,CTMediator 会调用所有注册了该事件的对象的 performActionWithParameter: 方法。
@interface MyObject : NSObject <CTActionProtocol>
@end

@implementation MyObject
- (void)performActionWithParameter:(id)parameter {
    NSLog(@"MyObject received event with parameter: %@", parameter);
}
@end

// 注册事件
[CTMediator registerTarget:myObject action:@selector(performActionWithParameter:) forEvent:@"myEvent"];

// 触发事件
[CTMediator triggerEvent:@"myEvent" withParameter:@"Hello, World!"];

这种方式的优点是灵活性高,易于扩展,并且可以在运行时动态地添加或移除事件处理者。同时,它也符合 iOS 开发中常见的解耦和松耦合的设计原则。