7

UAGitHubEngineGitHub の API にアクセスするために使用しています。いくつかのデータを取得するために、機能的なリアクティブ アプリを作成したいと考えています。非同期ネットワーク リクエストをセットアップするために、ここのコードに依存しています。私が探しているのは、「General」という名前のチームのチーム ID です。フィルタリング/印刷の部分はOKです:

[[self.gitHubSignal filter:^BOOL(NSDictionary *team) {
    NSString *teamName = [team valueForKey:@"name"];
    return [teamName isEqualToString:@"General"];
}] subscribeNext:^(NSDictionary *team) {

    NSInteger teamID = [[team valueForKey:@"id"] intValue];

    NSLog(@"Team ID: %lu", teamID);
}];

しかし、コマンドの設定は私にとって謎です:

self.gitHubCommand = [RACCommand command];

self.gitHubSignal = [self.gitHubCommand addSignalBlock:^RACSignal *(id value) {
    RACSignal *signal = ???

    return signal;
}];

非同期ネットワーク呼び出しが返されたときにイベントをプッシュするシグナルを返すようにシグナル ブロックを設定するにはどうすればよいですか?

4

1 に答える 1

4

その答えは、RACReplaySubjectAFNetworking非同期要求をラップするために使用する にありました。

self.gitHubCommand = [RACCommand command];

self.gitHubSignals = [self.gitHubCommand addSignalBlock:^RACSignal *(id value) {
    RACReplaySubject *subject = [RACReplaySubject subject];

    [engine teamsInOrganization:kOrganizationName withSuccess:^(id result) {

        for (NSDictionary *team in result)
        {
            [subject sendNext:team];
        }

        [subject sendCompleted];            
    } failure:^(NSError *error) {
        [subject sendError:error];
    }];

    return subject;
}];

シグナルのシグナルを返すのでaddSignalBlock:、それが発行する次のシグナルを購読する必要があります。

[self.gitHubSignals subscribeNext:^(id signal) {
    [signal subscribeNext:^(NSDictionary *team) {
        NSInteger teamID = [[team valueForKey:@"id"] intValue];

        NSLog(@"Team ID: %lu", teamID);
    }];
}];

最後に、addSignalBlock:コマンドが実行されるまでブロックは実行されません。これは次のように管理しました。

[self.gitHubCommand execute:[NSNull null]];
于 2013-04-02T18:24:37.200 に答える