很抱歉这个多问题的帖子,但它们都有些相关。如果其中一些是显而易见的,我很抱歉,我仍然试图围绕ReactiveCocoa。
我有UIViewController
传递了RACSignal
,需要显示其值。如果设备上已经存在模型对象,或者当获取完成时需要获取模型,该信号将立即发出模型对象;所以,基本上信号是一种承诺。这允许我从视图控制器中删除所有网络知识。
如果用户解除视图控制器,我不再需要信号发出的任何信号。 这在视图控制器中是否正常?
- (void) dealloc
{
[_modelSignalDisposable dispose] ; // Dispose of the subscription to the signal
}
假设在发生模型提取时设备失去连接,这会导致信号发出错误。在这种情况下,我可能会显示类似重装按钮的内容,让用户再试一次。当用户点击重新加载按钮时,是否可以重新订阅相同的信号,即使它已完成?如果没有,我该如何“重置”信号?请记住,视图控制器无法从头开始重新创建信号,因为它不知道如何创建信号。
有问题的信号实际上是RACSubject
的子类,称为Command
(与RACCommand
无关)。它背后的想法是Command
在订阅时启动网络获取,从而覆盖--subscribe:启动网络操作。如果视图控制器因用户交互而超出范围,我希望订阅处理取消任何相关的提取操作。 这是正确的模式吗?
- (RACDisposable *) subscribe:(id<RACSubscriber>)subscriber
{
RACDisposable *rd = [super subscribe:subscriber] ;
[self.remoteService startFetching] ;
@weakify(self);
return [RACDisposable disposableWithBlock:^
{
@strongify(self) ;
[self.remoteService cancelFetching] ;
[rd dispose] ;
}] ;
}
答案 0 :(得分:4)
是的,这是完全合理的。虽然我会使用如果用户解除视图控制器,我不再需要信号发出的任何信号。这在视图控制器中是否正常?
-takeUntil:self.rac_willDeallocSignal
代替,但我不必为了保持一次性使用而烦恼。
让我们说在发生模型提取时设备会丢失连接,这会导致信号发出错误。在这种情况下,我可能会显示类似重装按钮的内容,让用户再试一次。当用户点击重新加载按钮时,我是否可以重新订阅相同的信号,即使它已完成?如果没有,我如何&#34;重置&#34;信号?请记住,视图控制器无法从头开始重新创建信号,因为它不知道如何创建信号。
如果信号是冷信号,您可以简单地重新订阅。也就是说,如果信号在订阅时某事。通常这意味着您使用+[RACSignal createSignal:]
创建了信号。
有问题的信号实际上是RACSubject的一个子类,称为命令(与RACCommand无关)。它背后的想法是命令在订阅时启动网络获取,从而覆盖--subscribe:启动网络操作。如果视图控制器由于用户交互而超出范围,我希望订阅处理取消任何相关的提取操作。这是正确的模式吗?
您有正确的想法,但您可以使用+[RACSignal createSignal:]
而不是子类RACSubject
。