我有一个简单的表格。有许多元素。我希望用户看到显示中某些元素的短暂变化。我设置了更改(更改多个对象的 alpha),在数据库中做一些工作,睡眠(1)恢复 alpha 设置,然后继续。睡眠 (1) 非常明显,但对象没有明显变化。
我假设由于睡眠在我的方法中,所以它假设该方法必须在更新显示之前完成。有没有办法强制显示图形更改?
非常感谢
主线程正在运行一个所谓的运行循环。它基本上是这样工作的:
您的代码通常在“对事件做出反应”阶段运行。您更改了 UI 对象,但是当您休眠时,“更新 UI”部分无法执行,休眠已完成。只要您在主线程上休眠,就不会发生 UI 更新或动画,也不会处理任何触摸。这就是为什么你永远不会阻塞主线程的原因。
因此,您需要将您的方案更改为异步的,例如使用performSelector:withObject:afterDelay:
or dispatch_after
。或者,如果您只是在做简单的动画,您可能想使用animateWithDuration:animations:completion:
和朋友。
如果你需要做一些不能异步完成的事情,你想在不同的线程中运行它。然后在主线程上进行 UI 更新,使用performSelectorOnMainThread:withObject:waitUntilDone:
ordispatch_sync
或dispatch_async
(几乎所有 UI 更新都需要在主线程上完成)。