2011-02-15 113 views
1

我有一個應用程序,它有一個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

您應該在另一個線程中加載活動 - 您在同一個(主)線程中執行此操作: startSynchronous表示這一點。 我認爲ASI庫支持在不同的線程中加載它,但我對庫不是很熟悉。 (你可以調用像

[請求setDelegate:自我];

[請求startAsynchronous];

,然後執行:

- (空)requestFinished: (ASIHTTPRequest *)請求

a在該方法中刪除網絡活動指示符。 )

或者你也可以做這樣的事情(硬盤的方式 - 開始自己的線程;)):

[NSThread detachNewThreadSelector:@selector(loadBanner :) toTarget:自withObject:PARAM]。

當loadBanner方法結束後,你應該回到你的主線程的旗幟被加載,這樣的事情:

(從loadBanner方法調用此)

[自performSelectorOnMainThread :@selector(bannerIsLoaded :) withObject:rez waitUntilDone:NO];

並在方法bannerIsLoaded中刪除網絡活動指示器並顯示橫幅本身。