订阅 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;
}
我在 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;
}