iPhone - Помощь с MBProgressHUD, Sudzc, веб-сервисами и NSThread - PullRequest
3 голосов
/ 01 февраля 2011

У меня есть следующий код, который подключается к веб-службе и возвращает массив категорий.

Я использую следующую оболочку для веб-служб SOAP:

http://www.sudzc.com/

.. и следующие MBProgressHUD для индикатора активности:

https://github.com/jdg/MBProgressHUD

Я хотел бы, чтобы индикатор прогресса HUD указывал, что он подключается и получает результаты.В настоящее время я использую MBProgressHUD для достижения желаемого эффекта, однако я замечаю, что он не совсем работает должным образом.Индикатор прогресса исчезает до того, как фактические ячейки в моем tableView загружаются и отображаются.Я также использую MBProgressHUD в различных областях своего приложения, но обычно каждый раз, когда я подключаюсь к веб-службе, чтобы получить результаты.

Может ли кто-нибудь привести меня в правильном направлении, как исправить приведенный ниже кодправильно работать?Я думаю, что это может быть связано с тем, что метод обратного вызова срабатывает после отображения индикатора прогресса.Не совсем уверен, как правильно реализовать MBProgressHUD с помощью метода обратного вызова.

Это моя ужасная попытка "попытаться" заставить его работать.

- (void)showHUD {
    HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];

    // Add HUD to screen.
    [self.navigationController.view addSubview:HUD];

    // Register for HUD callbacks so we can remove it from the window at the right time.
    HUD.delegate = self;

    HUD.labelText = @"Loading";

    // Show the HUD while the provided method executes in a new thread
    [HUD showWhileExecuting:@selector(runLocalNotificationHandler) onTarget:self withObject:nil animated:YES];
}

- (void)runLocalNotificationHandler {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    [self performSelectorOnMainThread:@selector(connectToService) withObject:nil waitUntilDone:YES];

    [pool release];
}

- (void)connectToService {
    Service1 *service = [[Service1 alloc] init];
    [service GetCategories:self action:@selector(handlerGetCategories:)];
    [service release];
}

- (void)handlerGetCategories:(id)value {
    // parse objects returned from array, populate array, reload table view data, etc
}

Ответы [ 3 ]

6 голосов
/ 07 февраля 2011

Если вы используете MBProgressHUD в ситуации, когда выполняется обратный вызов, тогда существует другой подход.Инициализируйте HUD перед началом фонового процесса с помощью

MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];

вместо

HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];

, а затем добавьте в метод обратного вызова следующее:

[MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];

Таким образомВы точно знаете, когда ваш HUD показывается и закрывается.По крайней мере, это поможет вам отладить, где настоящая проблема, посмотрев, что изменится после использования нового подхода.

1 голос
/ 06 февраля 2011

Не выполняйте сетевые операции в основном потоке, потому что это заблокирует пользовательский интерфейс. В вашем случае MBProgressHUD не будет анимировать или даже не показывать.

Так что не используйте performSelectorOnMainThread. Вместо этого вызовите метод connectToService напрямую. MBProgressHUD отсоединит новый поток самостоятельно при вызове showWhileExecuting.

0 голосов
/ 07 февраля 2011

В конце концов понял это, изменив мой класс Utility. Я выполнял главный селектор дважды!

...