2012-06-07 178 views
0

我有一個應用程序,它定期輪詢服務器。輪詢使用計時器任務執行。定時器只需要在一個屏幕上使用,所以當我移動到其他屏幕時,定時器失效。NSTimer - 創建多個實例

我觀察到有時計時器會失效,但有時不會。當它沒有失效時,多個實例不斷被創建。

我如下已初始化定時器:

timer = [NSTimer scheduledTimerWithTimeInterval: 2 
             target: self 
             selector: @selector(timerTask:) 
             userInfo: nil 
             repeats: YES]; 

並被無效如下:

if(timer){ 

    [timer invalidate]; 
    timer = nil; 


} 

請幫幫忙,有什麼需要在這種情況下進行。

在此先感謝。

回答

1

您是否正在創建多個定時器?在代碼剪斷你上面貼,如果計時器已經定義,當你執行:

timer = [NSTimer scheduledTimerWithTimeInterval: 2 
            target: self 
            selector: @selector(timerTask:) 
            userInfo: nil 
            repeats: YES]; 

任何進一步引用計時器只會給你最新的一個創造,讓原來的一個參考的唯一途徑是檢查選擇器中的參數,看它是否與你定義的定時器實例變量不同。

+0

是的,當用戶回到需要完成輪詢的原始屏幕時,我正在重新初始化定時器。這個問題主要發生在我進入下一個屏幕時 - >定時器停止 - >屏幕2被調用 - >後退按鈕被點擊 - >視圖被從超級視圖 - >刪除,並在這裏創建新的實例。我認爲這是造成問題。我需要定時器恢復當回擊時 – iOSDev

+0

這是如何實現的? – iOSDev

0

沒有任何方法可以「恢復」NSTimer。您可以創建一些屬性來跟蹤創建計時器時以及屏幕2被調用時的日期(其中包括時間)。當你移動到屏幕2時,使計時器無效,當你回到屏幕1時,獲取2個日期對象之間的時間差,從你想要的輪詢時間中減去該時間,並用該時間間隔創建一個新的計時器。這似乎是計時器對用戶的「恢復」。

0

我認爲你應該retainNSTimer對象。

timer = [[NSTimer scheduledTimerWithTimeInterval: 2 
              target: self 
             selector: @selector(timerTask:) 
             userInfo: nil 
             repeats: YES] retain]; 

和無效

if(timer){ 

    [timer invalidate]; 
    [timer release]; 
    timer = nil; 
} 
+0

如果我釋放計時器,應用程序崩潰 – iOSDev

1

你或許應該創建startingstopping定時2種不同的方法,如下所示。

-(void)startTimer { 

    if([timer isValid]) { 
     [timer invalidate]; 
     timer = nil; 
     } 

    timer = [NSTimer scheduledTimerWithTimeInterval: 2 
           target: self 
           selector: @selector(timerTask:) 
           userInfo: nil 
           repeats: YES]; 
} 

-(void)stopTimer { 

    if([timer isValid]) { 
     [timer invalidate]; 
     timer = nil; 
    } 
    } 

這可以讓你start計時器,如果實例已經有效的它也將無效,並開始一個新的。停止它將使其無效,並且timer已準備好在您的下一個startTimer呼叫中被初始化。

希望這會有所幫助!

+0

我這樣做,但仍然是同樣的問題...請幫助..直到現在 – iOSDev