2011-09-27 19 views
3

我試圖將Android應用程序移植到iPhone。在Android上,我可以使用TimerAtFixedRate通過使用TimerTasks每60秒輕鬆處理數據: timer.scheduleAtFixedRate(task,15000,epochLengthMs);針對定期任務的iPhone等價物Timer和TimerTask

謝謝!

我可以在iPhone上使用類似的東西嗎?

protected void startTimer(){ 

    if(timerStarted){ 
     //avoid duplicate timers! 
    }else{ 

     running = true; 
     timerStarted = true; 

     if(D)Log.w(TAG,"*Timer Started*"); 
     timer = new Timer(); 
     readyToProcess = true; 
     EpochCounterTask task = new EpochCounterTask(); 
     AutoSaveTask saveTask = new AutoSaveTask(); 

     //give statMagnitude enough time to get values 
     //after 15 sec, every 60 sec 
     timer.scheduleAtFixedRate(task,15000, epochLengthMs); 
     timer.scheduleAtFixedRate(saveTask,645000, 600000); 

     } 

} 

回答

3

您將需要創建兩個NSTimers - 一個用於元計數器,一個用於自動保存任務。事情是這樣的:

- (void)startTimer { 

if(timerStarted){ 
    //avoid duplicate timers! 
}else{ 

    running = true; 
    timerStarted = true; 

    readyToProcess = true; 

    epochTimer = [[NSTimer scheduledTimerWithTimeInterval:epochSeconds 
             target:self 
             selector:@selector(processEpochTimer:) 
             userInfo:nil 
             repeats:YES] retain]; 

    autosaveTimer = [[NSTimer scheduledTimerWithTimeInterval:autosaveSeconds 
             target:self 
             selector:@selector(processAutosaveTimer:) 
             userInfo:nil 
             repeats:YES] retain]; 
    } 
} 

您還需要定義以下處理方法,當計時器火災被稱爲:

- (void)processEpochTimer:(NSTimer*)theTimer; 
- (void)processAutosaveTimer:(NSTimer*)theTimer; 
+0

這個偉大的工程。定時器每隔幾秒就會觸發一次。感謝最後的保留,我忘記了這一點,這可能會帶來一些不好的後果! –

+0

定時器在被添加到runloop時會被保留,所以它們仍然是'live'。這裏的「保留」僅用於嚴格遵守Objective C內存管理約定。我假設epochTimer和autosaveTimer是你的類中的數據成員,並且你需要保留它們,這樣你可以在以後停止定時器(調用invalidate然後發佈)。 –

1

看看http://www.iphoneexamples.com/定時器

定時器 此計時器將每1秒鐘調用一次myMethod。

[NSTimer scheduledTimerWithTimeInterval:1 
    target:self 
    selector:@selector(myMethod:) 
    userInfo:nil 
    repeats:YES]; 

如果您需要將對象傳遞給myMethod,該怎麼辦?使用「userInfo」屬性。 1.首先創建定時器

[NSTimer scheduledTimerWithTimeInterval:1 
    target:self 
    selector:@selector(myMethod:) //don't forget the ":" 
    userInfo:myObject 
    repeats:YES]; 
  1. 隨後的NSTimer對象傳遞給你的方法:

    - (無效)的MyMethod:(*的NSTimer)定時器 //現在我可以訪問所有的屬性和方法myObject [[timer userInfo] myObjectMethod];

要停止計時器,使用 「無效」:

[myTimer invalidate]; 
myTimer = nil; // ensures we never invalidate an already invalid Timer 
+0

我檢查了文檔,它提到選擇器應該是這樣的形式: - (void)processDataForTimer:(NSTimer *)theTimer,接受一個計時器作爲參數 –

+0

是的它應該是。我也包括只有......所以問題是什麼? – DShah