在发送此消息时是否有某种方式指定我在所有挂起的UI事件(如果有)之后执行我的选择器? IE浏览器。在事件队列中给我的aterDelay定时器一个较低的优先级。
答案 0 :(得分:5)
实际上,performSelector:withObject:afterDelay:
并不一定要在主线程上发生;这就是为什么有一个单独的方法performSelectorOnMainThread:withObject:waitUntilDone:
。 performSelector:withObject:afterDelay:
的文档说
在延迟后使用默认模式在当前线程上调用接收器的方法。
如果您想在后台执行任务,可以查看+[NSThread detachNewThreadSelector:toTarget:withObject:]
,它将启动一个新线程来执行您的任务,并让UI保持响应。使用单独的线程执行长时间运行的任务可能会锁定您的UI通常是一个好主意,但它确实增加了复杂性。如果你不熟悉线程,你最终可能会遇到没有任何意义的错误。
在上面的评论中,您提到您认为动画可能会导致UI无法响应。如果您正在使用内置的动画支持(Core Animation或其中一个Cocoa包装器),则动画不应使您的UI无响应。无响应的UI通常意味着您的程序在主线程上做了大量工作,然后让运行循环返回到服务UI事件。
答案 1 :(得分:0)
不直接。如果您使用performSelector:withObject:afterDelay:
选择器是在主线程上执行的,那么根据定义,它将在所有当前“待处理”UI事件执行后发生 - 但这可能在中间滚动或动画,您可能认为它是一个连续的事件,但实际上是数百个独立事件。
但是,您可以使用performSelectorInBackground:withObject:
实现类似的操作,然后在调用的方法中调用[NSThread setThreadPriority:0.01]
。小心 - 你打开一个后台线程,所以你不能做任何UI调用。但是,这将允许您在优先级低于主UI线程的后台线程上执行工作。 (记得建立一个自动释放池,因为它在自己的线程中!)