2013-06-24 29 views
4

我想在標籤中顯示的實際時間,我發現兩種方法來更新NSDate使用NSTimer或performSelector在iOS更新中構建實時時鐘?

performSelector方法:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self updateTime]; 
} 

- (void)updateTime 
{ 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"hh:mm:ss"]; 
    label.text = [dateFormat stringFromDate:[NSDate date]]; 

    //call updateTime again after 1 second 
    [self performSelector:@selector(updateTime) withObject:self afterDelay:1.0]; 
} 

NSTimer方法:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    Timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime) userInfo:nil repeats:YES]; 
}  

- (void)updateTime 
{ 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"hh:mm:ss"]; 
    label.text = [dateFormat stringFromDate:[NSDate date]]; 
} 

哪一個更好,更高效和可靠的方法?

+1

創建'NSDateFormatter'非常昂貴。創建一次並重用它。 –

回答

4

首先,這與Xcode不太相關。

其次:更高性能? 認真嗎?當它被稱爲每秒一次?只要忘記擔心效率。

第三,它們是等價的,但我沒有看到需要類似遞歸的自我調用方法。只要去與NSTimer,這正是它發明的原因。

+0

這兩種情況都沒有遞歸。 'performSelector:withObject:afterDelay:'只是調度由運行循環管理的未來對自身的調用;沒有炸燬煙囪的危險。 – ipmcc

+0

@ipmcc我沒有寫它會炸燬堆棧,我沒有(但你是對的,技術上沒有遞歸。)我的主要問題是可讀性和濫用工具。 – 2013-06-24 13:32:52

+0

感謝您快速解答H2CO3和ipmcc。我會用'NSTimer'去。 – seinfeld

1

計時器盡最大努力在「固定」時間表上執行,即每秒鐘執行一次。

另一方面,在一個函數的末尾調用會花費500ms來執行,這將導致函數每1500ms(執行所需的500ms + 1s延遲)被調用。

因此計時器更可靠。正如H2CO3所說的那樣,忘記性能,對於這樣簡單的任務來說這不成問題。

+0

Thx爲您解釋。我注意到如果我使用'scheduledTimerWithTimeInterval:0.5'秒仍然正確運行(每秒)。這是爲什麼? – seinfeld

+0

您每秒更新兩次。這只是你看不到它,因爲在連續兩次運行期間文本保持不變。 – Cyrille

+0

好了,現在我明白了,thx再次。 – seinfeld