我在我的NSArray上有一个ViewModel对象:
@property (非原子的,强的) NSArray *viewModel;
ViewModel对象如下所示:
@interface ViewModel : NSObject
@property (nonatomic) BOOL isSelected;
@end我试图在RACCommand的init方法上为RACSignal创建一个enabledSignal:
- (id)initWithEnabled:(RACSignal *)enabledSignal signalBlock:(RACSignal * (^)(id input))signalBlock如果选择了0 viewModel对象,或者所选viewModels的数量等于viewModels的总数,则此信号将通知命令启用。
我可以创建一个RACSequence,它将为我提供由以下代码选择的viewModel对象:
RACSequence *selectedViewModels = [[self.viewModels.rac_sequence
filter:^BOOL(ViewModel *viewModel) {
return viewModel.isSelected == YES;
}]
map:^id(ViewModel *viewModel) {
return viewModel;
}];如何创建有效的信号?
发布于 2013-10-31 15:46:42
要观察更改的所有最新视图模型(仅包括最新的视图模型),我们需要在每次数组更改时设置新的KVO观测。
最自然的方式来表示这是一个信号信号。每个“内部”信号代表对一个版本的viewModels的一组观察,然后我们将使用-switchToLatest来确保只有最新的信号生效:
@weakify(self);
RACSignal *enabled = [[RACObserve(self, viewModels)
// Map _each_ array of view models to a signal determining whether the command
// should be enabled.
map:^(NSArray *viewModels) {
RACSequence *selectionSignals = [[viewModels.rac_sequence
map:^(ViewModel *viewModel) {
// RACObserve() implicitly retains `self`, so we need to avoid
// a retain cycle.
@strongify(self);
// Observe each view model's `isSelected` property for changes.
return RACObserve(viewModel, isSelected);
}]
// Ensure we always have one YES for the -and below.
startWith:[RACSignal return:@YES]];
// Sends YES whenever all of the view models are selected, NO otherwise.
return [[RACSignal
combineLatest:selectionSignals]
and];
}]
// Then, ensure that we only subscribe to the _latest_ signal returned from
// the block above (i.e., the observations from the latest `viewModels`).
switchToLatest];https://stackoverflow.com/questions/19693443
复制相似问题