在 iOS 中在后台线程中获取 Facebook 好友

Getting Facebook friends in background thread in iOS

我正在尝试使用 [FBRequestConnection startForMyFriendsWithCompletionHandler] 获取当前用户的 Facebook 好友 从主线程调用它时代码运行良好,但当我从后台线程调用它时它永远不会进入完成处理程序

- (void)getFacebookFirneds {
    [FBRequestConnection startForMyFriendsWithCompletionHandler:^(FBRequestConnection *connection,
                                                              id result,
                                                              NSError *error) {
        if (!error) {
            // this code is not reached !!
        }    
    }];
}

即当我调用 [self getFacebookFirneds] 时它工作,但是当我使用 [self performSelectorInBackground:@selector(getFacebookFirneds) withObject:nil]; 它永远不会进入完成处理程序,不知道为什么!

我也试过FBRequest得到了同样的结果

- (void)getFacebookFirneds {
    FBRequest* friendsRequest = [FBRequest requestForMyFriends];
    [friendsRequest startWithCompletionHandler: ^(FBRequestConnection *connection,
                                              NSDictionary* result,
                                              NSError *error) {
        if (!error) {
            // this code is not reached !!
        }    
    }];
}

我也尝试使用 GCD 而不是 performSelectorInBackground 并得到了相同的结果

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                         (unsigned long)NULL), ^(void) {
    [self getFacebookFriends];
});

如果您的处理程序需要时间来处理朋友,您可以在主线程中调用 [self getFacebookFriends] 并在后台处理朋友数组 即

- (void)getFacebookFriends {
    [FBRequestConnection startForMyFriendsWithCompletionHandler:^(FBRequestConnection *connection,
                                                              id result,
                                                              NSError *error) {
        if (!error) {
            NSArray *facebookFriends = [result objectForKey:@"data"];
         [self performSelectorInBackground:@selector(processFacebookFriends: ) withObject:facebookFriends];
        }    
    }];
}

- (void)processFacebookFriends:(NSArray *)facebookFriends {
// put your code here
}