Facebook请求线程问题



好吧,我对线程有点陌生,所以我有这个问题。我正试图从Facebook上获取朋友的信息,我不想在主线程上这样做。但是由于某种原因,当请求不在主线程上时,回调永远不会被调用,我不知道为什么!

我有一个数组与所有的ID从我的朋友和循环通过这个数组,并创建我的自定义类朋友的对象(它获得所有我需要的信息)与每个ID。我将这个对象添加到数组中。这个friend对象向Facebook发出请求,并处理响应以获得我想要的数据。

下面是代码:
dispatch_async(dispatch_get_global_queue(0, 0), ^(void) {
            [self getFBFriendsInfo];
        }); 

 -(void)getFBFriendsInfo{
if (friendsInfoArray) {
    [friendsInfoArray removeAllObjects];
}
else{
    friendsInfoArray =[[NSMutableArray alloc]init];
}

for (int i=0; i<[UDID count]; i++) {
    NSString *udid = [UDID objectAtIndex:i];
    FriendsInfo *friend =[[FriendsInfo alloc] initWithFacebook:facebook andUdid:udid];
    [friendsInfoArray addObject:friend];
    [friend release];
}
dispatch_async(dispatch_get_main_queue(), ^(void) {
    [delegate friendsInfosAvailable:friendsInfoArray];
});

}

在我的自定义类中,我这样做:

[facebook requestWithGraphPath:udid andDelegate:self];
对于

,永远不会调用回调函数!只有当我在主线程上执行请求时,它才能工作:

dispatch_async(dispatch_get_main_queue(), ^(void) {
    [facebook requestWithGraphPath:udid andDelegate:self];

});

这就是为什么在另一个线程上你没有得到响应的原因:

Facebook将使用NSURLConnection执行请求。为了使连接正常工作,调用线程的运行循环必须在默认的运行循环模式下运行(阅读NSURLConnection类参考)。当您使用dispatch_async()时,不会在默认的运行循环模式下运行循环(除非您在主调度队列上,因此在主线程上运行)。因此,我认为请求甚至没有发送(如果你愿意,你可以嗅探你的网络来检查。)

所以,简而言之,你应该在主线程上发出请求;因为它是异步的,所以它不会冻结你的应用程序。然后,如果处理响应太昂贵,在后台处理它。

我真的希望这对你有帮助。

最新更新