我也在我的iOS中使用RACSignal的RACSignal范例。到目前为止一切都很顺利。然而,我在订阅信号时遇到了一个问题。在第一次订阅时,一切都很好。然而,进一步的订阅不会。
代码
在我的viewModel中,有一个RACSignal声明如下:
viewModel.h
@property (strong, readonly, nonatomic) RACSignal *updatedContentSignal;viewModel.m
@property (nonatomic, readwrite, strong) RACSubject *updatedContentSignal;然后像视图模型的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信号是呼叫/触发?
发布于 2016-01-05 00:37:46
由于您的代码不是很全面,所以我只能说,信号一完成(通过sendCompleted:或sendError:)就会被排除。
因此,如果您想要继续,您必须只使用sendNext:。
只使用sendCompleted,以防您想要显示它不再被使用。
如果收到错误,将使用SendError:。因此,在您的web服务块中,您需要这样的内容:
if(!error) {
sendNext:xxx;
} else {
sendError:error;
}https://stackoverflow.com/questions/34063427
复制相似问题