Использование цикла while для остановки, пока я не верну некоторые данные - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть класс, который я использую для взаимодействия с Facebook в Objective C для приложения 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. Затем вызывается запрос функции didLoad делегата (self), который использует переменную для передачи данных обратно в функцию getAllFriends, которая затем возвращает их тому, кто их вызвал.

Суть в том, что я пытаюсь использовать цикл while для остановки функции, пока она не получит ответ. При отладке ясно, что функция didload запроса никогда не вызывается объектом facebook. Он вызывается, когда я удаляю цикл while ... таким образом, запрос данных выполнен успешно, и проблема заключается в цикле while.

Мне интересно, есть ли способ остановить функцию, пока данные не будут получены ... Я, вероятно, делаю что-то очень глупое, поэтому мне нужна помощь!

Спасибо

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Запрос Facebook выполнит обратный вызов делегата в вашем потоке, который вы блокируете в цикле while.Это то, что вызывает вашу проблему.

Что касается дизайна, у вас есть API, который работает довольно асинхронно, но вы создали над ним синхронную оболочку.Вам нужно сделать это таким образом?Я бы порекомендовал вам изменить свой класс GWFacebook на использование делегата или блока для возврата NSArray друзей.

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

Таким образом, вы не блокируете свой пользовательский интерфейс, и вам может быть проще предоставить любойиндикаторов ожидания в вашем пользовательском интерфейсе.

1 голос
/ 30 ноября 2011

Вы должны использовать NSNotificationCenter для загрузки подобных вещей.

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

Отправлять и получать сообщения через NSNotificationCenter в Objective-C?

Сделайте свой собственный селектор, когда это будет сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...