FBSDKGraphRequest в структуре болтов никогда не вызывает блок

У меня есть следующий код:

[[[PFFacebookUtils logInInBackgroundWithAccessToken:[FBSDKAccessToken currentAccessToken]] continueWithSuccessBlock:^id(BFTask *task) {

    PFUser *user = task.result;

    return user;

}] continueWithSuccessBlock:^id(BFTask *task) {

    BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource];

    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil];

    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {

        if (error) {
            [source setError:error];
            return;
        }

        [source setResult:result];
    }];

    return source.task;
}];

FBSDKGraphRequest отлично работает вне задачи Bolts, но внутри задачи не вызывается startWithCompletionHandler.

Есть идеи?

3 ответа

Я нашел обходной путь. Просто оберните его в блок основного потока. Это будет работать как шарм.

dispatch_async(dispatch_get_main_queue(), ^{
    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil];

    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {

        if (error) {
            [source setError:error];
            return;
        }

        [source setResult:result];
    }];
});

Я столкнулся с той же проблемой. Похоже, что PFFacebookUtils выполняет свой блок продолжения в другом потоке, но похоже, что FBSDKGraphRequest ожидает запуска из основного потока. Я обнаружил, что проблема может быть альтернативно решена путем указания исполнителя.

BFTask* loginTask = [PFFacebookUtils logInInBackgroundWithReadPermissions:@[]];
[loginTask continueWithExecutor:[BFExecutor mainThreadExecutor] withSuccessBlock:^id _Nullable(BFTask * _Nonnull task) {
    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil];
    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
        // This code gets called properly
    }];
}];

У нас была точно такая же проблема, и мы использовали одно и то же решение, но я не могу найти ни одного сообщения, объясняющего, почему это происходит.

Другие вопросы по тегам