我有一个类,我用它在Objective C中与Facebook进行交互,用于我的iPhone应用程序。
GWFacebook.h
@interface GWFacebook : Facebook <FBRequestDelegate>
{
bool query_running;
NSArray* query_result;
}
- (void)request:(FBRequest *)request didFailWithError:(NSError *)error;
- (void)request:(FBRequest *)request didLoad:(id)result;
- (void)LogIn;
- (NSArray*)getAllFriends;
@end
GWFacebook.m
#import "GWFacebook.h"
@implementation GWFacebook
- (void)request:(FBRequest *)request didLoad:(id)result
{
query_result = result;
query_running = false;
}
- (NSArray*)getAllFriends
{
NSMutableDictionary * params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"SELECT first_name, last_name, uid, pic_big FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me()) ORDER BY mutual_friend_count desc",@"query",nil];
query_running = true;
bool localbool = true;
[self requestWithMethodName: @"fql.query" andParams: params andHttpMethod: @"POST" andDelegate: self];
while(localbool)
localbool = query_running;
return query_result;
}
@end
基本上函数getAllFriends发出一个fb请求,并将这个对象设置为facebook请求委托。然后调用委托(self)的requestdidload函数,并使用一个变量将数据传递回getAllFriends函数,然后该函数将数据返回给调用它的对象。
它的长和短是,我试图使用一个while循环暂停函数,直到它收到响应。在调试中,很明显facebook对象永远不会调用request didload函数。当我删除while循环时调用它…因此,数据请求是成功的,而while循环是问题所在。
我想知道是否有一种方法来拖延一个功能,直到数据被接收…我可能在做一些非常愚蠢的事情,所以我需要一些帮助!
谢谢
Facebook请求将在你的线程上执行委托回调,你在while循环中阻止了它。这就是你的问题所在。
作为一个设计问题,您有一个相当异步工作的API,但是您在它上面创建了一个同步包装器。你需要那样做吗?我建议你改变你的GWFacebook类,使用一个委托或块来返回好友的NSArray。
- (void)getAllFriends:(void (^)(NSArray *))callbackBlock
这样你就不会阻塞你的UI,并且你会发现在UI中提供任何类型的等待指示器更容易。
你应该使用NSNotificationCenter来加载这样的东西。
http://developer.apple.com/library/mac/文档/可可/引用/基金/类/nsnotificationcenter_Class/引用/Reference.html
在Objective-C中通过NSNotificationCenter发送和接收消息?