物聯(lián)網(wǎng)應(yīng)用-基于Aspects的AOP實(shí)戰(zhàn)

項目背景:

藍(lán)牙或WiFi的項目,通常會按照訂制好的協(xié)議交互數(shù)據(jù)。比如從BLE接收到數(shù)據(jù):0x01,按照協(xié)議解析數(shù)據(jù)0x01的意思是設(shè)備已打開,我們需要在客戶端需要做相應(yīng)的業(yè)務(wù)邏輯處理。

上面一段項目背景中我們可以提取一下開發(fā)關(guān)鍵詞:

  • 藍(lán)牙(WiFi)交互數(shù)據(jù):在客戶端可以從相應(yīng)的代理或者Block拿到發(fā)送過來的NSData
  • 協(xié)議:定義客戶端與硬件端交互數(shù)據(jù)所代表的意義,如0x01:開燈。如果協(xié)議較為復(fù)雜,可以嘗試將協(xié)議轉(zhuǎn)模型。

所以在開發(fā)過程中我們通常的流程是:
流程圖.png

其中:根據(jù)解析結(jié)果派發(fā)數(shù)據(jù),常規(guī)做法為:
未命名文件-3.png

通過走代理、通知、blcok的方式將結(jié)果傳輸?shù)礁鱾€界面,完成相應(yīng)的業(yè)務(wù)邏輯。

但是在AOP中,我們并不需要大量的使用通知、代理、blcok,只需要在需要使用數(shù)據(jù)的地方對解析結(jié)果進(jìn)行攔截,從而獲取我們需要的數(shù)據(jù),流程如下:


未命名文件-5.png

數(shù)據(jù)攔截庫的實(shí)現(xiàn):基于Appects框架封裝回調(diào)方法,可實(shí)現(xiàn)勾取對應(yīng)解析結(jié)果具體可看:Aspects

代碼片段:

接收數(shù)據(jù)
+ (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;
    }
} 
數(shù)據(jù)解析

數(shù)據(jù)轉(zhuǎn)模型可以寫一個runtime工具類去處理。

+ (HNGetDeviceInfoCode *)getDeviceInfoModel:(NSData *)data{
   HNGetDeviceInfoCode *code = [HNGetDeviceInfoCode AnalysisDataToModel:data BytesArray:@[@1,@1,@1,@1,@6,@1,@1]];
    DLog(@"%@",code);
    return code;
}
數(shù)據(jù)攔截庫
+(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在物聯(lián)網(wǎng)應(yīng)用中的架構(gòu)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容