回调的设计初衷,请保证数据的一致性

2020-04-02  本文已影响0人  飛天江郎

最近在用同事的库做二次开发,新的工程是打算用Swift来写,结果我发在处理一个数据的回调的时候,只要去读一下那个数据就会出错。我一度怀疑我可能学的假Swift了,怎么处理个普通的delegate回调都不行了呢?!
当我对数据进行追踪的时候,我发现错误来自于库里面,它通过一个回调,回调了不同的数据内容,导致我在读的时候,出现数据类型不匹配的错误,具体如下:

@protocol ManagerDelegate <NSObject>
@optional
/**
 @param array 设备数组
 @param status 状态
 */
-(void)onManagerPeripherals:(NSArray<Entity*> *)array
               updateStatus:(BLEStatus)status;
/////////////////////////////////////////////

这里使用的是一种可选的回调,主要想用来回调数组内容为Entity的数据内容
然后我进入回调内容那里一看,事情大条了

-(void)notePeripheralChanged:(NSNotification*)note{
 NSString *name = note.name;
    NSArray *peripherals = [NSArray new];
    BLEStatus status = BLEStatusUnknown;
    
    //分别处理不同命令
    if ([name isEqual:kUI_BLE_FOUND])
    {
        status = JL_BLEStatusFound;
        peripherals = note.object; // 这里传回来的是一组[Entity] 内容
    }
    else if ([name isEqual:kUI_BLE_PAIRED])
    {
        status = BLEStatusPaired;
        Entity *entity = note.object;
        if (entity) peripherals = @[entity.mPeripheral]; //  但是这里的不是!!!!
        }
 if ([_managerDelegate respondsToSelector:@selector(onManagerPeripherals:updateStatus:)]) {
        [_managerDelegate onManagerPeripherals:peripherals updateStatus:status];
    }
}

这样的回调在Objective-c中是没有问题的,只要针对不同的Status来对应读取内容就可以了,但是这样的写法在Swift中却是非常致命的。
由此可见Swift的严谨性还是高于Objective-c的。
而且,我个人也非常不建议使用这样的写法,这样会导致在外面调用这些方法的人难以理解回调的数据类型。

在平时我们使用这种回调方法的时候,要么就不确定类型,让尽可能多的数据从一个接口回调到上层,再分流。要么就制定只回调一种类型的数据,那样才能写出优秀的代码。

上一篇下一篇

猜你喜欢

热点阅读