我在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
信号时都会继续工作?
答案 0 :(得分:1)
由于您的代码不是很全面,我只能说信号一旦完成就会被解雇(通过sendCompleted:
或sendError:
)。
因此,如果您想继续,则必须仅使用sendNext:
只有在您想要显示时才使用sendCompleted
,不再使用它。
SendError:
。因此,在您的Web服务块中,您需要以下内容:
if(!error) {
sendNext:xxx;
} else {
sendError:error;
}