BOb*_*der 4 iphone multithreading facebook objective-c
好吧,我对线程有点新意,所以我有这个问题.我试图从Facebook获取朋友的信息,我不想在主线程上这样做.但由于某种原因,当请求不在主线程上时,回调永远不会被调用,我不知道为什么!
我有一个包含我朋友的所有ID的数组,并循环遍历这个数组,并创建一个自定义类Friend的对象(它获取我需要的所有信息)和每个ID.我将此对象添加到数组中.这个朋友对象向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];
});
Run Code Online (Sandbox Code Playgroud)
}
在我的自定义类中我这样做:
[facebook requestWithGraphPath:udid andDelegate:self];
Run Code Online (Sandbox Code Playgroud)
有了这个回调从来没有被调用过!只有当我在主线程上执行请求时它才有效:
dispatch_async(dispatch_get_main_queue(), ^(void) {
[facebook requestWithGraphPath:udid andDelegate:self];
});
Run Code Online (Sandbox Code Playgroud)
这就是为什么在不同的线程上你没有得到回应:
Facebook将使用NSURLConnection来执行请求.为了使连接正常工作,调用线程的运行循环必须在默认的运行循环模式下运行(读取NSURLConnection类引用).当您使用dispatch_async()时,没有运行循环在默认运行循环模式下运行(除非您在主调度队列上,因此在主线程上运行).因此,我认为甚至没有发送请求(如果您愿意,可以检查是否嗅探您的网络.).
因此,简而言之,您应该在主线程上提出请求; 因为它是异步的,它不会冻结你的应用程序.然后,如果响应的处理过于昂贵,请在后台处理.
我真的希望这会有所帮助.
我最好的.
| 归档时间: |
|
| 查看次数: |
1361 次 |
| 最近记录: |