2013-01-04 36 views
2

我读核心动画编程指南和“交易”的章节中,我看到这个线程没有runloop

重要:当从线程修改图层属性不 有一个runloop,你必须使用明确的事务。

但是从苹果公司的documentation on NSRunLoop

您的应用程序不能创建或显式管理NSRunLoop 对象。每个NSThread对象(包括应用程序的主线程 )都有一个为其自动创建的NSRunLoop对象,如 所需。

是不是说每个线程都有runloop?或者是不是由NSThread创建的线程,如POSIX的并行线程

+2

每个* NSThread *有一个运行循环,但你也可以在C中创建线程,我想。 – borrrden

+0

如果您使用pthreads,您可能会查看相关问题的这个答案:http://stackoverflow.com/questions/4930957/nsstream-and-sockets-nsstreamdelegate-methods-not-being-called – Brandon

回答

8

它说:“每个NSThread对象,包括应用程序的主线程,需要有它自动创建一个NSRunLoop对象。”

如果你不这样做做任何试图访问线程运行循环的东西,系统都不会为该线程创建一个运行循环。

如果你没有做[[NSRunLoop currentRunLoop] run](或其他类似的东西),你的线程将不会运行它的运行循环。

UIApplicationMain函数负责为主线程。对于你创建的线程,如果你希望线程的运行循环有任何效果,你需要运行线程的运行循环。

下面是核心动画的情况下发生了什么(我认为),当你不使用显式事务。它开始一个事务,并在当前线程的运行循环中注册一个回调来提交它。 (如果有必要,这将为当前线程创建一个运行循环。)如果您没有运行线程的运行循环,则该回调将永远不会被调用。