5

Reactive Cococaに依存するOctokitを使用して、Github リポジトリ内のファイルのオブジェクト グラフをプリフェッチしようとしています。フェッチするディレクトリがなくなるまで、再帰的にドリルダウンするシグナルを作成する際に問題が発生しています。これは、私のリポジトリのディレクトリ グラフの例です(注: グラフをシンプルかつクリーンに保つために、ファイルは省略されています)。

RNGridMenuのディレクトリグラフ

- (RACSignal *)fetchContentTreeForRepository:(OCTRepository *)repository {
    return [[self fetchContent:Nil forRepository:repository parentContent:nil] doCompleted:^{
        // fetching tree finished, persist in database
    }];
}

- (RACSignal *)fetchContent:(OCTContent *)content forRepository:(OCTRepository *)repository parentContent:(OCTContent *)parentContent {
    return [[[[self.client fetchContents:content forRepository:repository] collect] deliverOn:RACScheduler.mainThreadScheduler]
            flattenMap:^RACSignal *(NSArray *fetchedContents) {
                // set the contents that were fetched
                id<OCTContentStoreProtocol>store = content ?: repository;
                store.contents = fetchedContents;

                // only search for contents of type "dir" (directory)
                NSArray *directories = [fetchedContents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"contentType = \"dir\""]];
                NSMutableArray *signals;
                for (OCTContent *fetchedDir in directories) {
                    [signals addObject:[self fetchContent:fetchedDir forRepository:repository parentContent:content]];
                }
                return [RACSignal merge:signals];
            }];
}

注:-fetchContents:forRepository:はリクエスト パスを作成しRACSignal、HTTP リクエスト操作をキューに入れる を返します ( OctoKit が行うセマンティクスに従おうとします)。

私が現在直面している問題は、このセットアップがリポジトリのコンテンツ (つまり、グラフの最上位オブジェクト) のフェッチのみを実行することです。-flattenMap:が呼び出され、シグナルの配列が適切に作成され、-merge:が返されます。目的は、ディレクトリ タイプの子がなくなったときに終了する再帰チェーンを作成することです (おそらく、-filter:それを確認するために a を追加する必要があります)。

目的は、Github リポジトリのファイルのグラフ全体をフェッチし、操作が終了したときに通知を受けることです。これを呼び出す方法の例を次に示します。

[[[GHDataStore sharedStore] fetchContentTreeForRepository:self.repository]
 subscribeNext:^(NSArray *contents) {
     // this would be called each time a new set of contents is received
     NSLog(@"received %i contents",[contents count]);
 }
 error:^(NSError *error) {
     NSLog(@"error fetching: %@",error.localizedDescription);
 }
 completed:^{
     // this would be called when mapping the graph is finished
     NSLog(@"finished fetching contents");
 }];

トップレベルのみを実行する理由は何ですか? を呼び出すと返されたシグナルが実行-subscribeNext:されると思っていたのですが、何か誤解しているようです。この仮定は、Reactive Cocoa の readme にある連鎖の例から来ています。-fetchContentTreeForRepository:-flattenMap:

編集:私はばかです。

4

1 に答える 1

4

問題はNSMutableArray、信号を初期化しないことです。

NSMutableArray *signals;
for (OCTContent *fetchedDir in directories) {
       [signals addObject:[self fetchContent:fetchedDir forRepository:repository parentContent:content]];
}
return [RACSignal merge:signals];

その最初の行をに変更するNSMutableArray *signals = [NSMutableArray new]と、うまくいくようです。

于 2013-07-01T17:21:54.327 に答える