Пользовательский интерфейс блоков AFHTTPRequestOperation

У меня есть следующий код, который извлекает некоторые данные из php-скрипта. Я обнаружил, что он блокирует интерфейс, поэтому индикатор выполнения не вращается. Есть ли простой способ отправить это в фоновый режим, чтобы пользовательский интерфейс мог делать все, что ему нужно? У меня сложилось впечатление, что этого можно было бы достичь с помощью блоков, но я был явно неправ (изучая Obj-C шаг за шагом!)

Спасибо!

NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                        self.user.username, @"username",
                        self.user.password, @"password",
                        nil];
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:
                        [NSURL URLWithString:@"http://domain.com"]];

    // Show animated progress indicator, etc    
[self enbleLoadingState:YES];

[client postPath:@"/en/api/login" parameters:params success:^(AFHTTPRequestOperation *operation, id response) {
    [self enbleLoadingState:NO];
    // Do stuff

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    [self enbleLoadingState:NO];
    // Show error
}];

person Julian    schedule 18.04.2012    source источник
comment
Этот код должен работать, запрос загружается в фоновом режиме. Проблема должна быть в другом.   -  person Felix    schedule 18.04.2012
comment
лучший подкласс AFHTTPClient и сделать его одноэлементным классом   -  person Felix    schedule 18.04.2012
comment
@ phix23 Но это не работает :( В моем php-скрипте я делаю сон (5), который ждет 5 секунд, а индикатор выполнения просто остается там, и я не могу нажать никакие другие кнопки в пользовательском интерфейсе. Я с использованием последних Xcode и iOS SDK на сегодняшний день. Это происходит в симуляторе, а также на iPad первого поколения. Я использую ARC... Я не могу придумать ничего другого, что могло бы пролить свет на это. Я буду попробуйте создать подкласс клиента, как вы сказали (думаю, я где-то видел пример этого).   -  person Julian    schedule 19.04.2012
comment
@ phix23 Я только что превратил AFHTTPClient в синглтон (в образце приложения для iOS был один, который я мог использовать с небольшими изменениями), и проблема остается, только код стал намного чище :) Есть идеи?   -  person Julian    schedule 19.04.2012
comment
Я до сих пор не знаю, где тратится время на основной поток, может быть, в enbleLoadingState:? Метод, запускающий запрос, должен вернуться немедленно. Проверьте это, вставив NSLog в начале и в конце метода и внутри блока успеха. NSLog в блоке успеха должен наконец распечататься.   -  person Felix    schedule 19.04.2012
comment
Ваше предложение работает, как и ожидалось (все работает в том порядке, в котором вы упомянули), и это побудило меня попробовать что-то еще: я вставил индикатор активности в представление (через IB и отцепил любой код), и это работает отлично. В ту минуту, когда я подключаю его как IBOutlet, он перестает вращаться при выполнении блока. Я переписал контроллер с нуля (он был не таким большим) и теперь все работает отлично! Должно быть, я что-то где-то напортачил... phinx23, если хотите, можете скопировать свой комментарий как ответ, и я отмечу его как правильный ответ, поскольку именно это привело меня к его решению...   -  person Julian    schedule 19.04.2012


Ответы (1)


Этот код должен работать, запрос загружается в фоновом режиме. Проблема должна быть где-то в другом. Я не знаю, где тратится время на основной поток, может быть, в enbleLoadingState:? Метод, запускающий запрос, должен вернуться немедленно. Проверьте это, вставив NSLog в начале и в конце метода и внутри блока успеха. NSLog в блоке успеха должен распечатываться последним.

person Felix    schedule 19.04.2012