美文网首页
回调的设计初衷,请保证数据的一致性

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

作者: 飛天江郎 | 来源:发表于2020-04-02 19:32 被阅读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的。
    而且,我个人也非常不建议使用这样的写法,这样会导致在外面调用这些方法的人难以理解回调的数据类型。

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

    相关文章

      网友评论

          本文标题:回调的设计初衷,请保证数据的一致性

          本文链接:https://www.haomeiwen.com/subject/xyrfphtx.html