7

我有以下代码:

[[[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 没有被调用。

有任何想法吗?

4

3 回答 3

20

我找到了解决方法。只需将其包装在主线程块中即可。它会像魅力一样工作。

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];
    }];
});
于 2015-06-02T16:12:29.430 回答
2

我们遇到了同样的问题,我们使用了相同的解决方案,但我似乎找不到任何帖子来解释为什么会发生这种情况。

于 2015-11-27T19:47:05.473 回答
2

我遇到了同样的问题。似乎 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
    }];
}];
于 2015-12-09T18:27:47.383 回答