gpt4 book ai didi

objective-c - 对象的 NSArray 的 RACSignal

转载 作者:太空狗 更新时间:2023-10-30 04:01:01 25 4
gpt4 key购买 nike

我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com