2016-06-09 19 views
-1

我在我的應用程序中的一個定時器之前用於定期啓動的任務(實際上是令牌刷新)。我在stackoverflow上找到代碼示例,它對我很有用。爲什麼通過大中央調度使用2個不同的定時器不起作用?

這是代碼示例定義(上面的實現報頭):

dispatch_source_t CreateDispatchTimer(double interval, dispatch_queue_t queue, dispatch_block_t block) 
{ 
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); 
    if (timer) 
    { 
     dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), interval * NSEC_PER_SEC, (1ull * NSEC_PER_SEC)/10); 
     dispatch_source_set_event_handler(timer, block); 
     dispatch_resume(timer); 
    } 
    return timer; 
} 

這是變量定義:

dispatch_source_t _timer; 
static double SECONDS_TO_FIRE = 60.000f; 

,然後有一個方法例如startTimer我在這裏推出了這個計時器:

- (void)startTimer { 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    _timer = CreateDispatchTimer(SECONDS_TO_FIRE, queue, ^{ 

     // NSLog(@"timer is fired"); 
     // do smth I need 

     } 
    }); 
} 

所以這段代碼對我很好。

現在我需要另一個(秒)定時器爲單獨的任務,應該在自己的時間間隔內觸發。

所以我複製上面的代碼在單獨的類中,設置了另一個時間間隔。 面對如果我使用相同的名稱爲dispatch_source_t - 如上面的CreateDispatchTimer,應用程序將不會被編譯!

因此,對於單獨班級中的第二個計時器,我將dispatch_source_t名稱更改爲另一個,如CreateTimerDispatch。所以應用程序已成功編譯。

但問題是 - 只有第二個計時器現在工作!第一次沒有被解僱!

如何解決這個問題?現在可以理解爲什麼只有最後一個計時器被觸發

+0

看起來它改變了第二個調度計時器的'timer'名字 - 然後在工作。現在測試。 –

+0

有沒有一個(好)的理由,你沒有使用'NSTimer'? – Wain

+0

它沒有爲我工作,因此我開始使用GCD,因爲我發現工作代碼 –

回答

0

找到原因 - 除了重命名dispatch_source_t CreateDispatchTimer這兩個定時器的名稱不同, 我需要爲第二個定時器重命名timer變量。

我發現第一個定時器被第二個定時器完全覆蓋(因爲它是以後創建的)。因此第一個計時器根本沒有開火。

所以對於第二定時器工作代碼示例以下:

dispatch_source_t CreateLocationTimerDispatch(double interval, dispatch_queue_t queue, dispatch_block_t block) { 
    dispatch_source_t timerForLocationRefresh = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); 
    if (timerForLocationRefresh) { 
     dispatch_source_set_timer(timerForLocationRefresh, dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), interval * NSEC_PER_SEC, (1ull * NSEC_PER_SEC)/10); 
     dispatch_source_set_event_handler(timerForLocationRefresh, block); 
     dispatch_resume(timerForLocationRefresh); 
    } 
    return timerForLocationRefresh; 
} 

變量:

dispatch_source_t _timerForLocationRefresh; 
static double SECONDS_TO_FIRE = 1800.f; // time interval lengh in seconds 1800 

主叫:

- (void)startTimer { 
    // second timer 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    _timerForLocationRefresh = CreateLocationTimerDispatch(SECONDS_TO_FIRE, queue, ^{ 

     // do smth 
    }); 
} 

總結:

    需要重新命名第二定時器的塊,例如
  • CreateDispatchTimer。 >CreateLocationTimerDispatch
  • timer第二計時器的變量也需要重新命名,例如, >timerForLocationRefresh
相關問題