订阅RACSignal的问题

时间:2015-12-03 10:25:22

标签: ios objective-c mvvm 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信号时都会继续工作?

1 个答案:

答案 0 :(得分:1)

由于您的代码不是很全面,我只能说信号一旦完成就会被解雇(通过sendCompleted:sendError:)。

因此,如果您想继续,则必须仅使用sendNext: 只有在您想要显示时才使用sendCompleted,不再使用它。

如果收到错误,则使用

SendError:。因此,在您的Web服务块中,您需要以下内容:

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