1

私はfriendsmashのFacebook の例から始めましたが、以前にスコアが設定されていない場合、スコアを取得することはできません。コードは以下です。これが呼び出された場合、単に FBRequestConnection で停止し、エラーや結果を生成せず、ブロック内でそれ以上のコードは実行されません。明らかにこれは受け入れられません。

最初に値を確認せずにスコアを投稿すると、問題なく投稿され、その値を正しく確認できます。スコアがまったく設定されていない場合、呼び出しが「ハング」することはないと思いますか、それともスコアをチェックせずに常に投稿する必要がありますか?

void FB_Controller::FB_SendScore(const int nScore)
{
    // Make sure we have write permissions
    FB_RequestWritePermissions();

    NSMutableDictionary* params =   [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                        [NSString stringWithFormat:@"%d", nScore], @"score",
                                        nil];

    NSLog(@"Fetching current score");

    // Get the score, and only send the updated score if it's highter
    [FBRequestConnection startWithGraphPath:[NSString stringWithFormat:@"%llu/scores", m_uPlayerFBID] parameters:params HTTPMethod:@"GET" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {

        if(error)
        {
            NSLog(@"ERROR getting score %@", error);
        }
        else if (result && !error) {

            int nCurrentScore = [[[[result objectForKey:@"data"] objectAtIndex:0] objectForKey:@"score"] intValue];

            NSLog(@"Current score is %d", nCurrentScore);

            if (nScore > nCurrentScore) {

                NSLog(@"Posting new score of %d", nScore);

                [FBRequestConnection startWithGraphPath:[NSString stringWithFormat:@"%llu/scores", m_uPlayerFBID] parameters:params HTTPMethod:@"POST" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {

                    if(error)
                    {
                        NSLog(@"ERROR posting score %@", error);
                    }
                    else
                        NSLog(@"Score posted");
                }];
            }
            else {
                NSLog(@"Existing score is higher - not posting new score");
            }
        }

        }];

    // Send our custom OG
    //FB_SendOG();
}
4

1 に答える 1

0

私はちょうどこの問題を抱えていました:

[result objectForKey:@"data"] から返される辞書は、ユーザーがアプリのスコアを Facebook に送信していない場合は空です。これにより、objectAtIndex が例外をスローします。とにかく、私はちょうど置き換えました:

int nCurrentScore = [[[[result objectForKey:@"data"] objectAtIndex:0] objectForKey:@"score"] intValue];

と:

int nCurrentScore = 0;
if ([[result objectForKey:@"data"] count]) {
    nCurrentScore = [[[[result objectForKey:@"data"] objectAtIndex:0] objectForKey:@"score"] intValue];
}
于 2014-06-02T22:05:08.500 に答える