1

ReactiveCocoa と KVO を使用すると、何かをサブスクライブすると、バインドしている値を変更するとすぐにサブスクライバーに通知されます。私の状態が user.firstName と user.lastName に依存しているとしましょう:

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
}

両方の変数が設定されている限り、またはいずれ firstNameかを変更するたびに setFullName が呼び出されますlastName

変更が「解決」してフルネームを呼び出すまで待ち​​たいので、そのように同じ関数に値を設定するsetFullNameと、最終値で1回呼び出されます。

どうやってやるの?

4

1 に答える 1

2

代わりにcombineLatest:を使用できますzip:。これは、すべての入力信号が値を送信するのを待ちます。このようにしてfirstNamelastName設定が行われた場合にのみ加入者に通知されます。

これが受け入れられず、firstNameまたはのみlastName変更される可能性がある場合throttle:は、combineLatest:. このようにして、スロットリング時間内にいくつかの変更が発生した場合、最後の値のみがサブスクライバーに送信されます。

補足:fullName現在の値に基づいて構築できる場合、なぜそれをプロパティに保存するのでしょうか? 信号として使用できます。

于 2013-08-24T21:32:06.730 に答える