【问题标题】:Observe object change in NSArray using ReactiveCocoa使用 ReactiveCocoa 观察 NSArray 中的对象变化
【发布时间】:2016-03-13 19:26:42
【问题描述】:

我正在创建简单的联系人应用程序,尝试学习 ReactiveCocoa 和 MVVM。 我将单元格的 ViewModel 数组存储在 tableView 的 ViewModel 中。当用户进入 tableView 的编辑模式时,某些单元格的 ViewModel 的某些属性可以随着用户更改单元格文本而改变。我想观察这些变化以启用/禁用完成按钮,并相应地启用/禁用将数据保存到模型的信号。 如何在 tableViews 视图模型中观察这些变化?

这是我尝试使用的一段代码:

-(RACSignal *)executeCheckChange {
    return [RACObserve(self, cellViewModels)
            map:^id(NSArray *viewModels) {
                for (id viewModel in viewModels) {
                    if([viewModel isKindOfClass:[STContactDetailsPhoneCellViewModel class]])
                    {
                        STContactDetailsPhoneCellViewModel *phoneViewModel = (STContactDetailsPhoneCellViewModel *)viewModel;
                        if([phoneViewModel isChanged])
                            return @(YES);
                    }
                }
                return @(NO);
            }];
}

但是这个RACObserve只有在数组本身改变时才会被调用,而不是数组的元素。

【问题讨论】:

    标签: ios objective-c mvvm reactive-cocoa


    【解决方案1】:

    在我的特殊情况下,我能够通过这种方式解决问题:

    -(RACSignal *)executeChangeCheck {
    
        @weakify(self);
        return [[RACObserve(self, cellViewModels)
                 map:^(NSArray *viewModels) {
    
                     RACSequence *selectionSignals = [[viewModels.rac_sequence
                     filter:^BOOL(id value) {
                         return [value isKindOfClass:[STContactDetailsPhoneCellViewModel class]];
                     }]
                     map:^(STContactDetailsPhoneCellViewModel *viewModel) {
                         @strongify(self);
                         return [RACObserve(viewModel, editPhone)
                                 map:^id(NSString *editPhone) {
                                     return @(![editPhone isEqualToString:viewModel.phone]);
                                 }];
                     }];
    
                     return [[RACSignal
                              combineLatest:selectionSignals]
                             or];
       }]
      switchToLatest];
    
    
    }
    

    总而言之,每次我的数组发生变化时,我都会在每个 ViewModel 上创建一组观察结果,以仅观察我感兴趣的这些的方式过滤它们,将观察结果的值与原始值进行比较并确保只有最新的信号才会生效。

    【讨论】:

    • 我是响应式的新手,我想观察一个对象数组并只返回那些标志设置为 true 的对象。 (isDownloaded)所以在你上面的代码中,我需要观察editPhone,然后返回viewModel对象。
    【解决方案2】:

    要观察类属性的变化,您需要使用键值观察功能向该属性添加观察者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      相关资源
      最近更新 更多