网络活动指标问题

时间:2011-02-15 09:31:41

标签: iphone ios4

我有一个应用程序,其中有一个工具栏,其中嵌入了一个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

当视图加载时,我正确地看到UIActivityIndi​​cator在上面的状态栏中旋转和NetworkActivity。但是当我点击开关时,应用程序“冻结”直到完成工作,然后快速显示微调器然后隐藏它。 我应该如何摆脱这个问题?

1 个答案:

答案 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中删除网络活动指示器并显示横幅本身。