iOS Developer

物联网应用-基于Aspects的AOP实战

2018-01-27  本文已影响56人  makemake
项目背景:

蓝牙或WiFi的项目,通常会按照订制好的协议交互数据。比如从BLE接收到数据:0x01,按照协议解析数据0x01的意思是设备已打开,我们需要在客户端需要做相应的业务逻辑处理。

上面一段项目背景中我们可以提取一下开发关键词:

所以在开发过程中我们通常的流程是: 流程图.png
其中:根据解析结果派发数据,常规做法为: 未命名文件-3.png
通过走代理、通知、blcok的方式将结果传输到各个界面,完成相应的业务逻辑。

但是在AOP中,我们并不需要大量的使用通知、代理、blcok,只需要在需要使用数据的地方对解析结果进行拦截,从而获取我们需要的数据,流程如下:


未命名文件-5.png

数据拦截库的实现:基于Appects框架封装回调方法,可实现勾取对应解析结果具体可看:Aspects

代码片段:

接收数据
+ (void)receiveData:(NSData *)data{
    
    NSString *dataString =  [NSString convertDataToHexStr:[data subdataWithRange:NSMakeRange(0, 1)]];
   
   int backCode = [[NSString hexStringToDecima:dataString] intValue];

    switch (backCode) {
        case 0x1:
        {
            
        }
            break;
        case 0x2:
        {
            
        }
        case 0x0F: 
        {

        }
        default:
            break;
    }
} 
数据解析

数据转模型可以写一个runtime工具类去处理。

+ (HNGetDeviceInfoCode *)getDeviceInfoModel:(NSData *)data{
   HNGetDeviceInfoCode *code = [HNGetDeviceInfoCode AnalysisDataToModel:data BytesArray:@[@1,@1,@1,@1,@6,@1,@1]];
    DLog(@"%@",code);
    return code;
}
数据拦截库
+(void)getDeviceUpdateStatus:(void (^)(BOOL isSuccess))handlerBlock{
    
    [object_getClass([HNBLEDataManager class]) aspect_hookSelector:@selector(getDeviceUpdataStatus:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo,NSData *data){
        BOOL isSuccess;
        [aspectInfo.originalInvocation getReturnValue:&isSuccess];
        if (handlerBlock) {
            handlerBlock(isSuccess);
        }
    } error:NULL];
}

Aspects
浅谈iOS在物联网应用中的架构

上一篇下一篇

猜你喜欢

热点阅读