1

FacebookのiOSAPIドキュメントから、グラフの友達リスト、または現在ログインしているユーザーの詳細を要求する2つのメソッドを作成しました。

- (IBAction)showMyFriends:(id)sender {
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    [[delegate facebook] requestWithGraphPath:@"me/friends" andDelegate:self];
    NSLog(@"Getting friends list");
}
- (IBAction)showMyDetails:(id)sender {
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    [[delegate facebook] requestWithGraphPath:@"me" andDelegate:self];
    NSLog(@"Getting my info");
}

これまでのところ合理的に聞こえます。これらの呼び出しから応答するデリゲートメソッドは次のとおりです。

- (void)request:(FBRequest *)request didLoad:(id)result
{
    NSLog(@"Got a request");

// Print out friends
//    NSArray * items = [NSArray alloc];
//    items = [(NSDictionary *)result objectForKey:@"data"];
//    for (int i=0; i<[items count]; i++) {
//        NSDictionary *friend = [items objectAtIndex:i];
//        long long fbid = [[friend objectForKey:@"id"]longLongValue];
//        NSString *name = [friend objectForKey:@"name"];
//        NSLog(@"id: %lld - Name: %@", fbid, name);
//    }


// Print out self username
    NSString *username = [result objectForKey:@"name"];
    NSLog(@"Username is %@", username);
    helloGreeting.text = [NSString stringWithFormat:@"Hello %@", username];

}

質問:ではdidLoad、現在の呼び出しがどのグラフ要求に関連しているかをどのように確認できますか?たとえば、上記のコードでは、友達リストを印刷するか、ユーザー名を印刷する必要があるため、リクエストの種類に応じて、場合によってはコードをラップする必要がある/switchステートメントをイメージします。

APIで明らかなものを見つけることができませんでしたが、関連する応答コードのみが実行されるようにするための最良のアプローチは何ですか?

4

3 に答える 3

3

上記のように、リクエストオブジェクトを調べて、どのリクエストがレスポンスを生成したかを確認できます。リクエストオブジェクトのurlプロパティを使用すると、どのリクエストが使用されたかをより簡単に確認できます。

たとえば、友達リストを取得するリクエストの場合

[facebook requestWithGraphPath:@"me/friends" andDelegate:self];

次のリクエストオブジェクトのURLを確認できます。

https://graph.facebook.com/me/friends

次のリクエストdidLoadの実装は、友達リストリクエストを検出し、各友達を反復処理します。

- (void)request:(FBRequest *)request didLoad:(id)result {

    // Friends request
    if([request.url rangeOfString:@"me/friends"].location != NSNotFound) {

        NSArray *friends = [result objectForKey:@"data"];
        for (int i=0;i<friends.count;i++) {

            NSDictionary *friend = [friends objectAtIndex:i];
            //NSLog([friend objectForKey:@"name"]);

        }  
    }
}
于 2012-07-11T18:02:23.587 に答える
1

これが、FBRequest変数を「didLoad」に戻す理由です。これを使用して、元のリクエストを検査できます。それは一種のくだらない解決策ですが、少なくともあなたはそれが何であったかを調べることができます。

于 2012-06-08T14:33:11.157 に答える
0

実際には、Hackbookが「currentAPICall」と呼ばれるintに基づいて切り替えを行っており、リクエストごとにintを設定し、その結果をチェックしているように見えます。つまり、すべてメインスレッドで行われると思います。

また、さまざまなタイプのさまざまな結果オブジェクトがあります。結果を見て、それが/meリクエストからのものか/homeからのものかを判断することになります。返されるオブジェクトを見て、さまざまな「if」があります。決して理想的ではありません。つまり

if([result objectForKey:@"first_name"]){
    // back from getMe()
}

if ([result objectForKey:@"data"]) {
    // more checking here- I have two calls that return a data object
}

更新:これは非同期リクエストでは機能しません。これらのほとんどは機能するため、代わりにrequest.urlをチェックして上記の方法を使用しました。これは、魅力のように機能します。

于 2012-06-11T07:04:40.607 に答える