2011-09-19 31 views
1

我正在尋找一個Objective-C函數來調用一個函數來以指定的時間間隔(2到5秒)更新UI。一些可以使用的(大致)這樣的僞代碼:iOS(客觀C)版本的ualarm()

array[String]; // already populated 

function1(){ 
    if (array.hasMoreElements()){ 
     call function2() in x seconds; 
    } 
} 

void function2(){ 
    update gui with next string in the array; 
    function1(); 
} 

我根本沒法用x秒睡眠(),因爲GUI會變得反應遲鈍;並且我無法創建新線程來更新GUI,因爲iOS UI元素不是線程安全的。我已經研究過ualarm(),但它很老很粗糙,有人告訴我在iOS庫中有類似的實用工具;但是我一直無法找到它。

回答

3

您可以使用NSTimer。這個API完全符合你想要做的。

您可以簡單地定義一個方法,像

-(void)updateUI { 
    //update interface 
} 

然後像做

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(updateUI) userInfo:nil repeats:YES]; 

這樣定時器將繼續打電話給你設定的方法。檢查參考以瞭解如何停止或使計時器失效。

+0

這絕對有效,但定時器在所有權和失效方面有一些尖銳的角落。它們最適合長時間運行,重複的特定時間間隔任務。對於一般的延遲和排空排隊,我通常堅持使用'performSelector',因爲它很難弄錯。 –

+0

是的,可能定時器比簡單地調用'performSelector'更加微妙,但是在「指定的時間間隔」(如OP所說的)的UI更新是一個「長時間運行,重複的特定時間間隔」任務說過)。我完全同意,對於一般的延遲,調用'performSelector'要簡單得多,但在這種情況下,我認爲'NSTimer'更適合這個問題 – Saphrosit

5

你說的是Obj-C,但是寫了類似C僞代碼的東西。如果你真的寫了普通的Obj-C,-performSelector:withObject:afterDelay是你想要的一般家庭在這裏下降。 (您可以在iOS 4.x及更高版本上使用「塊」)。例如在您的使用案例中:

- (void)displayNextString 
{ 
    if ([strings count] > 0) { 
     [self updateUIwithString:[strings objectAtIndex:0]]; 
     [strings removeObjectAtIndex:0]; 
     [self performSelector:@selector(displayNextString) withObject:nil afterDelay:2.0]; 
    } 
}