2011-07-12 45 views
1

我想從我的ftp服務器上使用Chilkat庫獲取目錄文件列表。 在這種情況下,我想在進程運行時爲UIActivityIndi​​catorView設置動畫。但問題是,UIActivityIndi​​catorView從未開始動畫。我使用的代碼是:把一個布爾假在一個runloop內

[self.activityIndicator startAnimating]; 
[selfgetListFromPath:ftpPath withConnection:ftpConnect]; 
[self.activityIndicator stopAnimating]; 

activityIndi​​cator是UIActivityIndicatorView對象,ftpPath是FTP服務器我的文件路徑的NSString的,並且getListFromPath是使用奇爾卡特算法從FTP服務器獲取列表的方法,ftpConnect是FTP連接類的對象。

我嘗試使用NSRunLoop之前調用getListFromPath功能,所以我改變了我的代碼爲:

[self.activityIndicator startAnimating]; 

BOOL waitingOnProcessing = YES; 
NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop]; 
while (waitingOnProcessing && [currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) { 

} 

[self getListFromPath:ftpPath withConnection:ftpConnect]; 
[self.activityIndicator stopAnimating]; 

這使activityIndicator動畫,但getListFromPath從來沒有發射。試用後,我選用再次改變了我的代碼爲:

[self.activityIndicator startAnimating]; 

    BOOL waitingOnProcessing = YES; 
    NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop]; 
    while (waitingOnProcessing && [currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) { 
     waitingOnProcessing = NO;  
    } 

    [self getListFromPath:ftpPath withConnection:ftpConnect]; 
    [self.activityIndicator stopAnimating]; 

它使activityIndicator動畫,同時也打響了getListFromPath功能。但我懷疑這個代碼,我對這個代碼?或者可能是使用NSRunLoop的不好做法? 有人可以告訴我

謝謝

+0

最後,我找到了答案,這個http://www.icodeblog.com/2010/03/04/iphone-coding-turbo-charging-your-apps-with-nsoperation/鏈接幫助我找到解決方案 –

回答

0

此代碼運行作爲一個「黑盒子」:當你的方法返回時,你不會看到更新發生

[self.activityIndicator startAnimating]; 
[self getListFromPath:ftpPath]; 
[self.activityIndicator stopAnimating]; 

所以UI更新。

你需要做的是startAnimating你的活動指標,然後在另一個線程中啓動你的getListFromPath。當該方法終止時,您將回調主線程,告訴它停止動畫指示器。

使用此方法:

[NSObject performSelectorInBackground:withObject:] 

開始你getListFromPath線程,那麼當它這樣做,叫

[NSObject performSelectorOnMainThread:withObject:waitUntilDone:] 

給控制回主線程,將停止旋轉動畫。

+0

忘記告訴你:只要記住*永遠*在主線程上做UI更新。 – Cyrille

+0

謝謝你的回答,但是如果我使用performSelectorInBackground:withObject:,它使我不得不使用@selector(getListFromPath :),對吧?怎麼樣的ftpPath參數?我不能得到沒有這個參數的目錄文件列表,你能給我另一個線索嗎? –

+0

您必須創建一個'threadedGetListFromPath'方法,它將設置一個自動釋放池,並從裏面啓動getListFromPath。然後,從你的主線程中調用'[self performSelectorInBackground:@selector(threadedGetListFromPath)]'。只要它是同一個類的私有成員(變種),'ftpPath'仍然可以從這個方法訪問。注意不要修改它,因爲您可能遇到併發問題。 – Cyrille

0

我不知道奇爾卡特庫,但它必須告訴你,你從你的FTP服務器收到答覆的一些方法。當你得到它時,你應該使用NSNotification或協議來告訴你的視圖控制器你有答案。當發生這種情況時,你停止微調。

+0

我剛剛從我的FTP服務器獲得了答案,並且我列出了我想要獲得的所有列表,但問題是,我無法啓動我的activityIndi​​cator進行動畫製作。但是我最後的代碼,讓我可以做到。問題是,我只是懷疑這個代碼,我可以這麼做嗎? –

+0

我不認爲你最後一段代碼是正確的做法。你需要確定你已經得到了答案,只需要使用我所做的最後一個代碼來停止微調器 – Peres

+0

,在顯示文件列表後,微調器就會停止。你能告訴我另一種方式嗎? –