2011-11-30 19 views
0

私のiPhoneアプリケーションのObjective CでFacebookと対話するために使用しているクラスがあります。whileループを使用してデータを取得するまで

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)の関数要求didLoadが呼び出され、変数を使用してデータをgetAllFriends関数に渡します。関数はそれを呼び出したものに返します。

私は、whileループを使用して応答を受け取るまで関数をストールしようとしています。デバッグでは、要求didload関数がfacebookオブジェクトによって呼び出されないことが明確になっています。 whileループを削除すると呼び出されます...したがって、データ要求は成功し、whileループが問題になります。

データが受信されるまで機能を停止する方法があるのだろうかと思っています。私はおそらく何か非常にばかげているので、私はいくつかの助けが必要です!

ありがとうございました

答えて

2

Facebookリクエストはスレッドでデリゲートコールバックを実行します。これはwhileループでブロックします。それがあなたの問題の原因です。

設計上の問題として、非同期的に機能するAPIがありますが、その上に同期ラッパーが作成されています。あなたはそうする必要がありますか? GWFacebookクラスを変更して、デリゲートまたはブロックを使用して、友人のNSArrayを返すことをお勧めします。

- (void)getAllFriends:(void (^)(NSArray *))callbackBlock 

このようにしてUIをブロックしないようにすると、UIにどのような種類の待機中インジケータを提供するのが簡単になるでしょう。

関連する問題