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