2016-03-13 28 views
2

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

这里的代码片段我试着使用:

-(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如果阵列本身发生变化时才会激活,而不是数组的元素。

回答

2

在我的具体情况,我能够解决的问题是这样的:

-(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]; 


} 

总而言之,每一个我的阵列的变化,创建设置每个的ViewModels的意见时,它们进行过滤以这样的我只观察到我感兴趣的方式,将观测值与原始值进行比较,并确保只有最新的信号才能生效。

0

要观察对类的属性所做的更改,您需要使用键值观察功能将观察者添加到该属性。