1

使用ReactiveCocoa和KVO,如果您訂閱了某些內容,它會在您更改綁定的值時立即通知訂閱者。比方說,我的狀態取決於user.firstName和user.lastName:直到代碼完成後纔等待ReactiveCocoa中的訂閱者通知?

RAC(self.fullName) = [RACSignal 
    combineLatest:@[RACAble(self.firstName), RACAble(self.lastName)] 
    reduce:^(NSString* firstName, NSString* lastName) { 
     return [NSString stringWithFormat:@"%@ %@", firstName, lastName]; 
    }]; 

self.firstName = @"Bob"; 
self.lastName = @"Wilson"; 
self.firstName = @"Amy"; 
self.lastName = @"Johnson"; 

// ... 

- (void)setFullName:(NSString*)fullName 
{ 
    NSLog(@"FULL NAME %@", fullName); 
    // Bob Wilson 
    // Amy Wilson 
    // Amy Johnson 
} 

只要這兩個變量的設置,它調用setFullName我改變要麼firstNamelastName各一次。

我希望它等到修改完成後才能調用全名,因此,如果我將這些值設置爲同樣的函數,那麼它會調用setFullName一次並顯示最終值。

我該怎麼做?

回答

2

而不是combineLatest:您可以使用zip:。這將等待所有輸入信號發送一個值。這樣只有在firstNamelastName設置發生時纔會通知用戶。

如果這是不能接受的,而且是可能的,要麼僅firstNamelastName會發生變化,那麼你可以把throttle:combineLatest:的輸出。這樣,如果在節流時間內發生了幾個變化,那麼只有最後一個值將被髮送給用戶。

備註:如果您可以根據當前值構建fullName,那麼爲什麼要將其存儲在一個屬性中?你可以使用它一個信號。

+0

該示例只是設法顯示的問題,它通常是我想更新一些視圖狀態基於幾個屬性 –

+0

我想也許最大的問題是我無法弄清楚在哪裏找到這樣的東西?我正在遍尋ReactiveCocoa github頁面,我找不到'throttle:'記錄在任何地方。它在哪裏? –

+0

如有疑問,請使用查找功能。 'throttle:'在RACSignal + Operations類別中。該文檔位於頭文件中。關於文件:是的,開始時有點難以設想,而且通常只有在你工作了一段時間之後纔會有意義。當您在源代碼或維基中找不到您要搜索的內容時,請前往SO,提出問題或向項目回購提交問題。無論何時,你都可以向他們提供優質的信息。真的很棒。 – allprog

相關問題