我在导航栏上有一个按钮,名为“编辑”。还有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;
}];