使用while循环暂停,直到我得到一些数据



我有一个类,我用它在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发送和接收消息?

最新更新