我有一个类EventPresentationController,它在Event对象中显示数据。该类需要传递一个Event对象,但有时需要首先从远程服务下载该对象。我不希望控制器对网络内容有任何了解,所以我认为不是传递一个Event对象,而是传递一个RAC信号。然后,如果对象存在,我可以立即发送信号,但如果需要下载对象,我可以下载它然后发送信号。但是,如果实际上需要进行下载,我希望控制器显示活动指示器。
我看到RACCommand有一个我可以订阅的执行信号,所以我想我可以传递它而不是一个事件,但在语义上用“命令”初始化一个视图控制器似乎很奇怪(相对于一个事件,或者发出事件的信号)。使用RACCommand是正确的做法吗?
答案 0 :(得分:1)
这是一个有趣的问题。我认为你的直觉是正确的,你应该向视图控制器传递一个信号。
所以,让我们一起去吧。然后,假设您的视图控制器具有activityIndicator
属性。
您应该可以执行以下操作:
- (id)initWithEventSignal:(RACSignal *)signal {
// ... init stuff ...
// Send a YES and then a NO when `signal` completes. If `signal`
// immediately sends a value, then it will immediately send NO.
RACSignal *loading = [[[RACSignal return:@YES] takeUntil:signal] concat:[RACSignal return:@NO]];
RAC(self.activityIndicator, hidden) = [loading not];
RAC(self, event) = signal;
// ... other stuff ...
}
当事件信号发送结果时,我们正在使用-takeUntil:
将loading
信号短路。