2015-04-24 2 views
2

Я очень новичок в этом реактивном программировании. Мне явно не хватает ссылки здесь.ReactiveCocoa с MVVM

Итак, в моем контроллере зрения на данный момент, у меня есть

- (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"; 
} 

ли я приближаюсь это неправильно? Я думал, это сработает.

Спасибо, Бен.

ответ

3

В вашем коде есть несколько проблем, которые ваш собственный ответ затронул, но причина, по которой вы не получаете сигнал next, состоит в том, что вы не устанавливаете строку с помощью self.string, вместо этого вы получаете прямой доступ к переменной класса как _string.

Properties are actually Objective-C methods, которые искусно скрыты от нас, когда вы звоните self.string = @"Test";, что на самом деле происходит, автоматически созданный setString: метода вашего класса вызывается, и ее поведение по умолчанию для установки _string к вновь переданного значения.

Причина, по которой RAC вам нужна, заключается в том, что _string - это обычная переменная, и RAC не знает, что эта переменная изменилась. Когда вы используете self.string, RAC может получать уведомления от времени выполнения, который вызвал метод setString: через то, что называется Key-Value Observation.

+1

Спасибо, очень полезно. Приятно знать, почему тоже. :) – Ben

2

был не так уж далеко от ...

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

просто должен быть

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

И

[viewModel test]; 

становится

[self.viewModel test]; 
Смежные вопросы