2

我试图弄清楚什么时候会NSFireDelayedPerform被触发以及这个的基本规则是什么。但我找不到任何提及此的文档或源代码。有人可以提供一点提示吗?

4

2 回答 2

6

我也遇到过这种情况,并且相信只要在指定延迟(低于 2 秒)后执行选择器时,就会调用它。

[foo performSelector:@selector(f1) withObject:nil afterDelay:2];

下面是主线程上的堆栈跟踪,其中应用程序在延迟 20.060 秒后被杀死。尽管指定了 2 秒延迟,但系统执行此选择器的时间要长得多(超过 10 秒)。这意味着系统使用 NSTimer 来处理带有afterDelay参数的performSelector调用。不幸的是,它似乎可能将调用放在主线程的事件队列上,然后等待指定的延迟(或更多):

6 基础 0x35bfaa6a __NSFireDelayedPerform

7 核心基础 0x3add45dc CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION + 12

于 2013-01-04T09:27:01.770 回答
0

我会从这里开始

https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1

没有提及,NSFireDelayedPerform但它在某种程度上是有道理的,因为这通常在CFRunLoop.

也许你也想看看这里:

iOS runloop 机制有什么指南吗?

或者实际上更基本:

http://developer.apple.com/library/ios/#documentation/general/conceptual/Devpedia-CocoaApp/MainEventLoop.html

于 2012-09-13T20:21:48.337 回答