一些ReactiveCocoa设计模式问题

时间:2014-03-15 00:45:17

标签: objective-c design-patterns uikit reactive-cocoa

很抱歉这个多问题的帖子,但它们都有些相关。如果其中一些是显而易见的,我很抱歉,我仍然试图围绕ReactiveCocoa。

我有UIViewController传递了RACSignal,需要显示其值。如果设备上已经存在模型对象,或者当获取完成时需要获取模型,该信号将立即发出模型对象;所以,基本上信号是一种承诺。这允许我从视图控制器中删除所有网络知识。

  1. 如果用户解除视图控制器,我不再需要信号发出的任何信号。 这在视图控制器中是否正常?

    - (void) dealloc
    {
        [_modelSignalDisposable dispose] ; // Dispose of the subscription to the signal
    }
    
  2. 假设在发生模型提取时设备失去连接,这会导致信号发出错误。在这种情况下,我可能会显示类似重装按钮的内容,让用户再试一次。当用户点击重新加载按钮时,是否可以重新订阅相同的信号,即使它已完成?如果没有,我该如何“重置”信号?请记住,视图控制器无法从头开始重新创建信号,因为它不知道如何创建信号。

  3. 有问题的信号实际上是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] ;
            }] ;
    }
    

1 个答案:

答案 0 :(得分:4)

  

如果用户解除视图控制器,我不再需要信号发出的任何信号。这在视图控制器中是否正常?

是的,这是完全合理的。虽然我会使用-takeUntil:self.rac_willDeallocSignal代替,但我不必为了保持一次性使用而烦恼。

  

让我们说在发生模型提取时设备会丢失连接,这会导致信号发出错误。在这种情况下,我可能会显示类似重装按钮的内容,让用户再试一次。当用户点击重新加载按钮时,我是否可以重新订阅相同的信号,即使它已完成?如果没有,我如何&#34;重置&#34;信号?请记住,视图控制器无法从头开始重新创建信号,因为它不知道如何创建信号。

如果信号是冷信号,您可以简单地重新订阅。也就是说,如果信号在订阅时某事。通常这意味着您使用+[RACSignal createSignal:]创建了信号。

  

有问题的信号实际上是RACSubject的一个子类,称为命令(与RACCommand无关)。它背后的想法是命令在订阅时启动网络获取,从而覆盖--subscribe:启动网络操作。如果视图控制器由于用户交互而超出范围,我希望订阅处理取消任何相关的提取操作。这是正确的模式吗?

您有正确的想法,但您可以使用+[RACSignal createSignal:]而不是子类RACSubject