0

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

编码

在我的viewModel我有一个RACSignal这样的声明:

视图模型.h

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

视图模型.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调用/触发一个信号时继续工作?

4

1 回答 1

1

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

因此,如果您想继续,您只需使用sendNext:.
仅使用sendCompleted,以防您想表明不再使用它。

SendError:使用,以防您收到错误。因此,在您的网络服务块中,您需要以下内容:

if(!error) {
    sendNext:xxx; 
} else {
    sendError:error;
}
于 2016-01-05T00:37:46.227 回答