代码改变世界

iPhone上的有没有立即绘制的接口?

2011-11-22 18:05  ianwang  阅读(328)  评论(0编辑  收藏  举报

    玩过一些平台如win32.bada上面都有立即绘制的接口。例如win32下 invalidatRect之后,updatewindow就可以立即绘制无效区域到窗口。

那iphone有没有类似的接口呢?

除了setNeedDisplayInRect这个发出重绘的异步接口,有没有一个立即刷屏的接口呢,就是说一个同步绘制的方法?实际工作中很容易产生这样的想法,即时刷新。

答案是没有好的方式。我们只能把当前runloop的消息(来自input resourse 或者timer resourse)处理完成。等到下一个循环进入drawrect方法完成实际绘制。

所以若在一个调用堆栈里面有复杂的计算或耗时的操作,中间又夹杂着一些绘制需求,时而发出setNeedDisplayInRect,其实这些都绘制是不能

立即完成的,只能等到下个runloop去drawRect了。很明显不符合实际的调用需求----立即绘制 更新UI界面。。。

所以最好把这些耗时的操作放到线程中去处理,减少ui主线程的繁杂度,让UI的轻度运行。工作线程可以向UI线程(主线程)发出实际的绘制请求,

这样UI线程就能够即时刷新呈现画面。问题的根本还是设计问题。

 

stackoverflow上的这篇贴子也说道几种怪异的方法,都是在当前任务的处理内取出下一个消息执行,是一种runloop的执行嵌套。估计win32的updatewindow也是这样的原理,

这些方法也许可以救急,但是软件的框架设计上最好遵循上述原则。