带有 MVVM 的 ReactiveCocoa

ReactiveCocoa with MVVM

我对这种反应式编程还很陌生。我显然在这里遗漏了 link。

好的,现在在我的视图控制器中,我有

- (void)viewDidLoad {
    [super viewDidLoad];

    viewModel = [[ViewModel alloc]init];

    [RACObserve(viewModel, string) subscribeNext:^(NSString* string){
         NSLog(@"%@", viewModel.string);
    }];

    // This fires the NSLog
    viewModel.string = @"Test12345";

    // This doesn't
    [viewModel test];
}

[viewModel 测试] 是...

-(void) test{
    _string = @"Test";
 }

我是不是处理错了?我认为这会起作用。

谢谢,本。

离得不远...

[RACObserve(viewModel, string) subscribeNext:^(NSString* string){
     NSLog(@"%@", viewModel.string);
 }];

只需要

[RACObserve(self, viewModel.string) subscribeNext:^(NSString* string){
     NSLog(@"%@", string);
}];

[viewModel test];

变成

[self.viewModel test];

您的代码中存在一些您自己的答案已经涵盖的问题,但是您没有收到 next 信号的原因是您没有使用 [=11= 设置字符串],而是直接访问 class' 变量作为 _string

Properties are actually Objective-C methods 巧妙地对我们隐藏了,当您调用 self.string = @"Test"; 时,实际发生的是正在调用 class 的自动创建的 setString: 方法,它的默认行为是将 _string 设置为新传递的值。

RAC之所以需要你这样做是因为_string只是一个普通的变量,RAC无法知道这个变量发生了变化。当您使用 self.string 时,RAC 可以从运行时获取通知,通知您通过称为 Key-Value Observation.

的方式调用了 setString: 方法