我有一个应用程序,其中有一个工具栏,其中嵌入了一个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。但是当我点击开关时,应用程序“冻结”直到完成工作,然后快速显示微调器然后隐藏它。 我应该如何摆脱这个问题?
答案 0 :(得分:1)
您应该在另一个线程中加载活动 - 您在同一个(主)线程中执行此操作: startSynchronous表明了这一点。 我认为ASI库支持在不同的线程中加载它,但我对这个库并不熟悉。 (你可以打电话给
[request setDelegate:self];
[request startAsynchronous];
然后实施:
- (void)requestFinished:(ASIHTTPRequest *)request
并在该方法中删除网络活动指示符。 )
或者你可以做这样的事情(艰难的方式 - 开始你自己的线程;)):
[NSThread detachNewThreadSelector:@ selector(loadBanner :) toTarget:self withObject:param];
当loadBanner方法结束时,您应该返回加载横幅的主线程,如下所示:
(从loadBanner方法调用此方法)
[self performSelectorOnMainThread:@selector(bannerIsLoaded :) withObject:rez waitUntilDone:NO];
并在方法bannerIsLoaded中删除网络活动指示器并显示横幅本身。