32

ReactiveCocoa では、いくつかの従属シグナルをチェーンする場合subscribeNext:、チェーン内の次のシグナルを使用して、以前に生成されたシグナル (たとえば、非同期操作の結果) の値を受け取る必要があります。しばらくすると、コードは次のようになります (不要な詳細は省略されています)。

RACSignal *buttonClickSignal = [self.logIn rac_signalForControlEvents:UIControlEventTouchUpInside];

[buttonClickSignal subscribeNext:^(UIButton *sender) {    // signal from a button click
    // prepare data

    RACSignal *loginSignal = [self logInWithUsername:username password:password];    // signal from the async network operation

    [loginSignal subscribeNext:^void (NSDictionary *json) {
        // do stuff with data received from the first network interaction, prepare some new data

        RACSignal *playlistFetchSignal = [self fetchPlaylistForToken:token];         // another signal from the async network operation

        [playlistFetchSignal subscribeNext:^(NSDictionary *json) {
            // do more stuff with the returned data
        }];

        // etc
    }];
}];

この増え続けるネストは、ドキュメントに記載されている非反応的な例よりもはるかに良く見えません。

[client logInWithSuccess:^{
    [client loadCachedMessagesWithSuccess:^(NSArray *messages) {
        [client fetchMessagesAfterMessage:messages.lastObject success:^(NSArray *nextMessages) {
            NSLog(@"Fetched all messages.");
        } failure:^(NSError *error) {
            [self presentError:error];
        }];
    } failure:^(NSError *error) {
        [self presentError:error];
    }];
} failure:^(NSError *error) {
    [self presentError:error];
}];

何か不足していますか?ReactiveCocoa に依存する作業をチェーンするより良いパターンはありますか?

4

1 に答える 1