0

我在导航栏上有一个按钮,名为“编辑”。还有UICollectionView一些内容的节目。单击“编辑”按钮将变为“编辑模式”,并且按钮的标题变为“完成”,UICollectionView单元格也应更新。单击“完成”按钮将执行相反的操作。

我已经编写了下面的代码:现在单击“编辑”|“完成”按钮后,孔集合视图将通过刷新进行更新,因为单元格中的图像来自服务,我没有更新它们。我更喜欢通过 Cell 的信号更新图标。但是如何重构代码?

1.viewController的 -(void)viewDidLoad

 [[[[self.editButton rac_signalForControlEvents:UIControlEventTouchUpInside]
    doNext:^(UIButton *sender) {
        if ([sender.titleLabel.text isEqualToString:@"Edit"]) {
            [sender setTitle:@"Done" forState:UIControlStateNormal];
        }else{
            [sender setTitle:@"Edit" forState:UIControlStateNormal];
        }
    }]
    flattenMap:^RACStream *(UIButton *sender) {
        BOOL isEditMode = [sender.titleLabel.text isEqualToString:@"Edit"];
        return [RACSignal return:@(isEditMode)];
    }] subscribeNext:^(NSNumber* x) {
        [self.viewModel setEditMode:x.boolValue];
    }];

  // Binding to view model
  [[RACObserve(self.viewModel, dataArray) 
     deliverOnMainThread] subscribeNext:^(id x) {
         @strongify(self);
         [self.collectionView reloadData];
     }];

2.1.viewController的ViewModel的 property

 @property (nonatomic, assign, getter= isEditMode) BOOL editMode;

2.2.viewController的ViewModel的 -(id)init

  self.isEditModeSignal = RACObserve(self, isEditMode);

3.viewController的 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

  DataModel* item = [self.dataArray objectAtIndex:indexPath.row];
  [cellViewModel setDataModel:item
         withIsEditModeSignal:self.viewModel.isEditModeSignal];
  [Cell setCellViewModel:cellViewModel];

4.Cell的ViewModel的 -(void)setDataModel:(DataModel)data withIsEditModeSignal:(RACSignal*)isEditModeSignal

 self.thing1Signal = [[RACSignal combineLatest:@[self.isEditModeSignal,
                                                     other1Signal,
                                                     other2Signal]
                                 reduce:^id(NSNumber *isEditMode,
                                            NSNumber *other1,
                                            NSNumber *other2){
                                     return @(isEditMode.boolValue && other1.boolValue && other2.boolValue);
                                 }];

 self.thing2Signal = [[RACSignal combineLatest:@[self.isEditModeSignal,
                                                     other3Signal,
                                                     other4Signal]
                                 reduce:^id(NSNumber *isEditMode,
                                            NSNumber *other3,
                                            NSNumber *other4){
                                     return @(isEditMode.boolValue && other3.boolValue && other4.boolValue);
                                 }];

5.Cell.m的 -(void)setCellViewModel:(CellViewModel*)viewModel

 [[[self.viewModel.thing1Signal deliverOnMainThread] takeUntil:self.rac_prepareForReuseSignal]  subscribeNext:^(NSNumber *isHidden) {
  self.icon1.hidden = isHidden.boolValue;
 }];

 [[[self.viewModel.thing2Signal deliverOnMainThread] takeUntil:self.rac_prepareForReuseSignal]  subscribeNext:^(NSNumber *isHidden) {
  self.icon2.hidden = isHidden.boolValue;
 }];
4

2 回答 2

0

这段代码真的很糟糕。您没有按照预期的方式使用 ReactiveCocoa。更好的方法是绑定 cellviewmodels 和 collectionview viewmodels。根本不需要触发刷新。

像这样:

// In cell viewmodel's init method:
RAC(self,isEditMode) = RACObserve(self, collectionViewModel.isEditMode); 
//Bind view stuff to: RACObserve(self,isEditMode)

//In collectionview viewmodel init method:
RAC(self,isEditMode) = [[[self.editButton.rac_command executionSignals] flatten] scanWithStart:@NO reduce:id^(NSNumber * running, id next) {
  return @(![running boolValue]);
}];

//In collectionview
RAC(self.editButton.titleLabel, text) = [RACObserve(self.viewModel, isEditMode) map:(NSString *)^(NSNumber * x) {
  [x boolValue] ? @"Edit" : @"Done";
}];

而不是使用 combineLatest 使用 if 信号。

于 2015-10-21T11:17:29.853 回答
0

啊哈,我发现了问题:我使用self.isEditModeSignal = RACObserve(self, isEditMode); 我应该使用self.isEditModeSignal = RACObserve(self, editMode);的 . 这是根本原因。

于 2015-10-21T11:02:25.910 回答