iOS - dispatcherTimer阻止触摸事件?

时间:2012-06-26 20:37:15

标签: ios input grand-central-dispatch dispatch

我正在使用调度程序源计时器以不同的帧速率更新视图。 (8,12或24 FPS)

这是初始化dispatcherTimer的代码和用于创建计时器的函数  (此功能直接取自apple 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上测试了这个。

任何帮助或提示都将不胜感激!

艾蒂安

更新

我在苹果开发者论坛上问了一个类似的问题,这是我得到的答案:https://devforums.apple.com/thread/156633?tstart=0

1 个答案:

答案 0 :(得分:1)

主运行循环在每次通过runloop后排出主队列。当你说你的持续时间太短时,我认为你是对的。如果源代码正在向队列中添加新块的速度超过它们的排放速度,那么我当然希望runloop永远不会恢复处理事件(因为它不断尝试排空队列)。