1

複数のメソッドがあり、それぞれにネストされたループと facebook リクエストがあります。X id の配列があり、各メソッドは各 id をループし、その id を要求してから結果データを処理します。

各メソッドが完了したときに通知を受ける必要があります...つまり、メソッドが配列内のすべての id のループを終了し、それぞれに対して facebook リクエストを作成し、結果を受け取り、結果のデータでタスクを終了したときです。これを実現する方法がわかりません。メソッドの例を次に示します。

- (void)runLoopForFacebookFriendsContent1 {

    for (NSString *fbIdStr in self.fbIdsArr){
        FBRequest *fbRequest = [FBRequest requestWithGraphPath:graphPathString parameters:nil HTTPMethod:@"GET"];
        [fbRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
            if (error) {
                //show alert
            } else {
                //Do stuff with the resulting data
            }
        }];
    }    
}

- (void)runLoopForFacebookFriendsContent2 {

    for (NSString *fbIdStr in self.fbIdsArr){
        FBRequest *fbRequest2 = [FBRequest requestWithGraphPath:graphPathStringNumber2 parameters:nil HTTPMethod:@"GET"];
        [fbRequest2 startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
            if (error) {
                //show alert
            } else {
                for (PF_FBGraphObject *obj in [result objectForKey:@"data"]){
                    NSLog(@"facebook result:  %@",result);
                        NSMutableDictionary *dict          = [[NSMutableDictionary alloc]init];
                        [dict setValue:@"type2" forKey:@"ContentType"];
                        [dict setValue:obj forKey:@"data"];
                        [self.theFacebookDataArray addObject:dict];
                }
            }
        }];
    }    
}

これらのメソッドは viewWillAppear で呼び出します。これらのメソッドの呼び出しを内部に配置するために、ある種の完了ハンドラーをセットアップする方法はありますか? それらがすべて完了したら、NSNotification を投稿しますか?

4

3 に答える 3

1

dispatch_group_enterこの動作は、呼び出してすぐに呼び出すために予想されますdispatch_group_leave。つまり、グループは何も待つ必要がありません。

dispatch_group_enterすべてのブロックの前に呼び出しdispatch_group_leave、すべてのブロックの終わりに呼び出す必要があります。

ここで受け入れられた答えを確認してください: 複数のネットワーク要求がすべて実行されるまで待ちます-それらの完了ブロックを含みます

更新: 特定の例では、dispatch_group_enterへのすべての呼び出しの前に呼び出し、完了ブロックの最後でstartWithCompletionHandler:呼び出すことができます。dispatch_group_leave

for (...) {
    FBRequest *fbRequest = ...;
    dispatch_group_enter(group);
    [fbRequest startWithCompletionHandler:^(...) {
        ...
        dispatch_group_leave(group);
    }
}
于 2013-03-09T09:02:22.407 に答える
1

自分の質問に答える必要はありませんでした...それをするのは本当に好きではなく、よりエレガントな解決策を望んでいました...しかし、それは来ていないようで、誰かが質問に反対票を投じました。だから私は自分の解決策を投稿して質問を締めくくるつもりです。同様の問題が発生し、これを読んでいる場合は、次の方法で対処しました。

メソッドごとに 2 つの int を作成します。1 つの int が、反復される配列のカウントですぐに設定されます。各反復の最後に、NSNotification を投稿しています。NSNotification ハンドラー メソッドでは、if 条件を実行するたびに 2 番目の int をインクリメントし、それらが一致するかどうかを確認しています。

このような方法がたくさんある場合、これらすべてを追跡するのは面倒です...だから、誰かがより良い解決策を見つけたら、それを聞いてみたいです. 答えてくれて助けてくれたみんな、ありがとう!

于 2013-04-02T19:54:41.810 に答える
1

1 つのオプションは、ReactiveCocoaフレームワークを調べることです。少し学習曲線を過ぎた後、この種のパターンで非常に役立つことがわかりました。

以下は、リンクされたファイルからの直接の例です。

// Perform 2 network operations and log a message to the console when they are
// both completed.
//
// +merge: takes an array of signals and returns a new RACSignal that passes
// through the values of all of the signals and completes when all of the
// signals complete.
//
// -subscribeCompleted: will execute the block when the signal completes.
[[RACSignal 
    merge:@[ [client fetchUserRepos], [client fetchOrgRepos] ]] 
    subscribeCompleted:^{
        NSLog(@"They're both done!");
    }];

これを Facebook SDK にかなり簡単に適応させることができます。

于 2013-03-09T06:31:08.143 に答える