订阅 RACSignal 问题

Subscribe issue with RACSignal

我在 iOS 中也使用 MVVM 范式和 RACSignal。到目前为止,一切进展顺利。但是,我在订阅信号时遇到了问题。在第一次订阅时一切正常。但是,进一步的订阅不会。

代码

在我的 viewModel 中,我有一个 RACSignal 声明如下:

viewModel.h

@property (strong, readonly, nonatomic) RACSignal *updatedContentSignal;

viewModel.m

@property (nonatomic, readwrite, strong) RACSubject *updatedContentSignal;

然后在 viewModel 的 designated initialiser 中像这样初始化:

self.updatedContentSignal = [[RACSubject alloc]init];

然后当我实际使用 viewModel 中的信号时,我会做这样的事情: 在 viewModel 的不同位置需要的地方 - 通常在 Web 服务块方法中

[(RACSubject *)self.updatedContentSignal sendNext:nil];
[(RACSubject *)self.updatedContentSignal sendCompleted];
[(RACSubject *)self.updatedContentSignal sendError:error];

viewController 我订阅了这样的信号:

[self.viewModel.updatedContentSignal subscribeNext:^(id x) {

    } error:^(NSError *error) {


    } completed:^{


    }];

我在 viewDidLoad

上订阅了一次信号

所以所有工作都在第一个 viewDidLoad 调用

问题

当我离开 viewController 并返回时,调用 viewWillAppear,并且 viewModel 触发各种触发信号的方法:

  [(RACSubject *)self.updatedContentSignal sendNext:nil];
    [(RACSubject *)self.updatedContentSignal sendCompleted];
    [(RACSubject *)self.updatedContentSignal sendError:error];

然而 viewController 不再接收信号。看来它只适用于他第一次订阅。

有没有办法让信号在每次调用/触发 updateContent 信号之一时继续工作?

由于您的代码不是很全面,我只能说信号将在完成后立即解除(通过 sendCompleted:sendError:)。

因此,如果您想继续,您只能使用 sendNext:
只使用 sendCompleted,以防你想表明它已不再使用。

使用

SendError: 以防您收到错误。所以在你的网络服务块中你需要这样的东西:

if(!error) {
    sendNext:xxx; 
} else {
    sendError:error;
}