iOS架构

iOS组件化开发-中间层

2018-12-27  本文已影响8人  Roys

组件化开发中,中间层是其中一种实现思路

首先,作为全局使用的中间层,单例是必然使用的

#import "Mediator.h"

#import <objc/runtime.h>        //利用运行时来实现,runtime文件是必须的

@interface Mediator ()

@end

@implementation Mediator

static Mediator *mediator;

#pragma mark -单例

+ (instancetype)sharedInstance {

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        mediator = [[Mediator alloc] init];

    });

    return mediator;

}

收发机制是本文的核心,也是组件化开发中,模块之间通信的根本

在此,使用performSelector来实现

- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params{

//目标类,为了整体统一方便管理,加上了TARGET_ 并创建了同名抽象类

NSString *targetNameStr = [NSString stringWithFormat:@"TARGET_%@", targetName];

//道理同上 在这个抽象类中也加入了统一管理的方法 以ACTION_开头

    NSString *classActionStr = [NSString stringWithFormat:@"ACTION_%@:", actionName];

    Class targetClass;

    targetClass =NSClassFromString(targetNameStr);

    target = [[targetClass alloc] init];    //建立类对象

    SEL action = NSSelectorFromString(actionString);    //指向事件的指针

        if (target == nil) {    //非空判断

                return nil;

    }

    if ([target respondsToSelector:action]) {

//消除警告

#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Warc-performSelector-leaks"

        if ([self checkReturnStyle:action target:target]) {//检测方法返回值是否为void

            [target performSelector:action withObject:params];    //若为空,返回nil

            return nil;

        } else {

            return [target performSelector:action withObject:params];    //不为空,返回方法执行完的值

        }

#pragma clang diagnostic pop

    }

    return nil;

}

- (BOOL)checkReturnStyle:(SEL)aSelector target:(NSObject *)target {

    Method meth = class_getInstanceMethod([target class], aSelector);

    char returnType[512];

    method_getReturnType(meth, returnType, 512);

        if (returnType[0] != 'v') {

        returnNO;

    } else {

        returnYES;

    }

}

到此,一个简单的中间层就基本结束了,当然,可以在上面添加缓存处理,获得更好的性能

上一篇下一篇

猜你喜欢

热点阅读