Проблема с индикатором сетевой активности - PullRequest
1 голос
/ 15 февраля 2011

У меня есть приложение, в котором есть панель инструментов с вложенным UISegmentedControl в виде подпредставления. Когда я переключаю сегмент, я делаю следующее:

/*
 * Set/Reset dei dati.
 */
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
if ( bannerVideo ) {
    [filmatiBanner release];
    filmatiBanner = nil;
    filmatiBanner = [[NSMutableArray alloc] initWithCapacity:0];
    [[bannerVideo view] setHidden:YES];
    [bannerVideo release];
    bannerVideo = nil;
}
[lowerBannerActivity setHidden:NO];
[lowerBannerActivity startAnimating];
url = [NSURL URLWithString:@"http://www.udc.ntx.it/filmatiBlocco2.asp"];
request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:[[voci objectAtIndex:[switches selectedSegmentIndex]] objectForKey:@"codblocco"] 
               forKey:@"CodiceBlocco"];
[request startSynchronous];
// Bla bla yada yada

Когда загружается представление, я правильно вижу вращение UIActivityIndicator и NetworkActivity в строке состояния выше. Но когда я нажимаю на переключатель, приложение «зависает», пока не выполнит свою работу, затем быстро показывает счетчик и затем скрывает его. Как мне избавиться от этой проблемы?

1 Ответ

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

Вы должны загрузить действие в другой поток - вы делаете это в том же (основном) потоке: startSynchronous указывает на это. Я думаю, что библиотека ASI поддерживает загрузку этого в другом потоке, но я не очень знаком с библиотекой. (Вы можете назвать что-то вроде

[запрос setDelegate: self];

[запрос startAsynchronous];

и затем реализовать:

- (void) requestFinished: (ASIHTTPRequest *) запрос

и в этом методе удалите индикатор сетевой активности. )

Или вы можете сделать что-то вроде этого (трудный путь - начать свой собственный поток;)):

[NSThread detachNewThreadSelector: @selector (loadBanner :) toTarget: self withObject: param];

Когда метод loadBanner завершен, вы должны вернуться к основному потоку, в котором загружен баннер, примерно так:

(вызывая это из метода loadBanner)

[self executeSelectorOnMainThread: @selector (bannerIsLoaded :) с объектом: rez waitUntilDone: NO];

и в методе bannerIsLoaded удалите индикатор сетевой активности и покажите сам баннер.

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