項目背景:
藍(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)模型。

流程圖.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];
}