objective-c - 对象的 NSArray 的 RACSignal

标签 objective-c reactive-cocoa

我的 ViewController 上有一个 ViewModel 对象的 NSArray:

@property (nonatomic, strong) NSArray *viewModels;

ViewModel 对象看起来像这样:

@interface ViewModel : NSObject

@property (nonatomic) BOOL isSelected;

@end

我正在尝试在 RACCommand 的初始化方法上为 enabledSignal 创建一个 RACSignal:

- (id)initWithEnabled:(RACSignal *)enabledSignal signalBlock:(RACSignal * (^)(id input))signalBlock

如果选择了 0 个 viewModel 对象,或者选择的 viewModel 的数量等于 viewModel 的总数,则此信号将通知命令启用。

我可以创建一个 RACSequence,它将给我通过这段代码选择的 viewModel 对象:

RACSequence *selectedViewModels = [[self.viewModels.rac_sequence

                                        filter:^BOOL(ViewModel *viewModel) {
                                            return viewModel.isSelected == YES;
                                        }]

                                       map:^id(ViewModel *viewModel) {
                                           return viewModel;
                                       }];

我将如何创建有效信号?

最佳答案

要观察所有最新的 View 模型(并且最新的 View 模型)的变化,我们需要在每次数组变化时设置新的 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];

关于objective-c - 对象的 NSArray 的 RACSignal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19693443/

相关文章:

ios - rac_signalForSelector fromProtocol,选择器不存在

swift - 扩展 ReactiveCocoa

objective-c - 在 ObjC 中格式化非常大的十进制数字的意外行为

objective-c - iOS:标记错误

objective-c - 更改 Popover 内的 View 外观?

ios - insertTimeRange:ofTrack:atTime:error:(类AVMutableCompositionTrack)在iPhone上失败

ios - RACSignal combineLatest 使用多个 UIControls

ios - UITableView 单元格的编辑模式转换

ios - 如何将 "SignalProducer<Bool, NoError>"转换为 ReactiveCocoa 3 的 "SignalProducer<Bool, NSError>"?

ios - 如何使用 ReactiveCocoa 正确发送具有初始值的信号?