2011-11-30 3 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 

기본적 기능은 FB getAllFriends 요청을 수행하고 북 요청 대리인으로이 개체를 설정한다. 그러면 델리게이트 (self)의 함수 요청 didLoad가 호출되고 변수를 사용하여 데이터를 getAllFriends 함수로 전달한 다음 getAllFriends 함수를 호출하여 변수를 반환합니다.

길고 짧은 것은 응답을 받기 전까지는 함수를 정지시키기 위해 while 루프를 사용하려고합니다. 디버깅에서 request didload 함수가 facebook 객체에 의해 호출되지 않는다는 것이 명백합니다. while 루프를 제거하면 호출됩니다 ... 따라서 데이터 요청이 성공하고 while 루프가 문제가됩니다.

임 데이터가 수신 될 때까지 함수를 멈추는 방법이 있는지 궁금하게 생각하고있다. .. Im 매우 어리석은 무엇인가 그렇게해서 나는 약간의 도움을 필요로한다!

감사

답변

2

Facebook 요청은 스레드에서 위임 콜백을 수행하며 while 루프에서 차단합니다. 그것이 당신의 문제를 일으키는 원인입니다.

디자인 측면에서 비동기 적으로 작동하는 API가 있지만 동기식 래퍼를 만들었습니다. 그런 식으로해야합니까? 친구의 NSArray를 반환하기 위해 대리인이나 블록을 사용하도록 GWFacebook 클래스를 변경하는 것이 좋습니다.

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

이렇게하면 UI가 차단되지 않으므로 UI에서 모든 종류의 대기 표시기를 제공하는 것이 더 쉬울 수 있습니다.

관련 문제