Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-Dispatchermer阻止事件?_Ios_Input_Grand Central Dispatch_Dispatch - Fatal编程技术网

iOS-Dispatchermer阻止事件?

iOS-Dispatchermer阻止事件?,ios,input,grand-central-dispatch,dispatch,Ios,Input,Grand Central Dispatch,Dispatch,我正在使用dispatcher源计时器以不同的帧速率更新视图。(8、12或24 FPS) 以下是初始化Dispatchermer的代码以及用于创建计时器的函数。 (此功能直接取自“创建计时器”小节中的apple doc): 电话: 功能: - (dispatch_source_t)createDispatchTimerWithInterval:(uint64_t)interval leeway:(uint64_t)leeway queue:(dispatch_queue_t)queue bloc

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

以下是初始化Dispatchermer的代码以及用于创建计时器的函数。
(此功能直接取自“创建计时器”小节中的apple doc):

电话:

功能:

- (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秒左右,触摸事件就会被捕获

我只在iOS4上用iPad2测试过这个

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

艾蒂安

更新


我在apple Developer论坛上问了一个类似的问题,下面是我得到的答案:

每次通过runloop后,主运行循环都会耗尽主队列。我认为你说的时间太短是对的。如果源代码向队列中添加新块的速度快于它们被释放的速度,我当然希望runloop永远不会恢复处理事件(因为它一直在尝试释放队列)。

使用“时间分析器”在Instruments中运行代码,并检查“所有线程状态”选项。当结果出来时,看看“线程策略”。仪器告诉你主线程在做什么?它是在忙着计算还是在等什么?
- (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;
}