Kun*_*ani 15 iphone multithreading posix uikit ios
我试图理解为什么不能使用多个线程执行UI操作.这也是OpenGL或cocos2d等其他框架的要求吗?
其他语言如C#和javascript怎么样?我试过在谷歌看,但人们提到了一些我不明白的POSIX线程.
Ama*_*mar 16
在Cocoa Touch中,UIApplication
即应用程序的实例附加到主线程,因为此线程是由UIApplicatioMain()
Cocoa Touch的入口点函数创建的.它设置主事件循环,包括应用程序的运行循环,并开始处理事件.应用程序的主事件循环接收所有UI事件,即触摸,手势等.
来自docs UIApplicationMain()
,
此函数从主类中实例化应用程序对象,并从给定类中实例化委托(如果有)并设置应用程序的委托.它还设置主事件循环,包括应用程序的运行循环,并开始处理事件.如果应用程序的Info.plist文件指定要加载的主nib文件,通过包含NSMainNibFile键和值的有效nib文件名,此函数将加载该nib文件.
这些应用程序UI事件进一步转发到UIResponder
响应者链之后,通常像UIApplication
- > UIWindow
- > UIViewController
- > UIView
- >子视图(UIButton
等).
响应者处理按钮按下,点击,捏缩放,滑动等事件,这些事件在UI中被转换为更改.因此,您可以看到这些事件链发生在主线程上,这就是原因UIKit
,包含响应者的框架应该在主线程上运行.
再次来自docs UIKit
,
在大多数情况下,UIKit类只能从应用程序的主线程中使用.对于从UIResponder派生的类或者涉及以任何方式操纵应用程序的用户界面的类尤其如此.
编辑
为什么drawRect需要在主线程上?
drawRect:
被称为生命周期的UIKit
一部分UIView
.所以drawRect:
必然是主线程.以这种方式绘图是昂贵的,因为它是使用主线程上的CPU完成的.通过使用CALayer技术(核心动画)提供硬件加速图形.
CALayer
另一方面,它充当视图的后备存储.然后,视图将显示其当前状态的缓存位图.对视图属性的任何更改都将导致后备存储中的更改由GPU在备份副本上执行.但是,视图仍需要提供初始内容并定期更新视图.我还没有真正使用OpenGL,但我认为它也使用了图层(我可能是错的).
据我所知,我试图回答这个问题.希望有所帮助!
归档时间: |
|
查看次数: |
5853 次 |
最近记录: |