2012-06-26 49 views
0

我正在使用調度程序源計時器以不同的幀速率更新視圖。 (8,12或24 FPS)iOS - dispatcherTimer阻止觸動事件?

以下是初始化dispatcherTimer和用於創建計時器的函數的代碼。
(此功能直接從小節 「創建一個計時器」 蘋果DOC採取:http://developer.apple.com/library/mac/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/GCDWorkQueues/GCDWorkQueues.html

電話:

self.dispatchTimer = [self createDispatchTimerWithInterval:self.project.frameDuration * NSEC_PER_SEC 
                leeway:0.0 * NSEC_PER_SEC 
                queue:dispatch_get_main_queue() 
                block:displayFrame]; 

功能:

- (dispatch_source_t)createDispatchTimerWithInterval:(uint64_t)interval leeway:(uint64_t)leeway queue:(dispatch_queue_t)queue block:(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_walltime(NULL, 0), interval, leeway); 
     dispatch_source_set_event_handler(timer, block); 
     dispatch_resume(timer); 
    } 
    return timer; 
} 

我的觀點更新完美,但觸摸事件不會被捕獲。我的第一個選擇是塊「displayFrame」需要很多處理時間,因爲如果我將frameDuration減少到0.5秒左右,觸摸事件就會被捕獲。

我只能用iPad 2的

任何幫助或提示將不勝感激這個測試在iOS 4!

艾蒂安

UPDATE

我曾問過類似的問題對蘋果developper論壇,這裏是我得到了答案:https://devforums.apple.com/thread/156633?tstart=0

+0

使用「Time Profiler」在儀器中運行代碼並檢查「所有線程狀態」選項。當結果回來時,請看「線程策略」。儀器告訴你主線程在做什麼?它忙於計算還是等待什麼? –

回答

1

主要運行循環的每個之後水渠主隊列通過runloop。當你說你的時間太短時,我認爲你是對的。如果源代碼將更多的新塊添加到隊列中,那麼我肯定會期望runloop永遠不會恢復處理事件(因爲它不斷嘗試排空隊列)。