2016-03-13 69 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

要觀察對類的屬性所做的更改,您需要使用鍵值觀察功能將觀察者添加到該屬性。