objective-c - 死锁 : How do you determine if a call may cause unsafe painting off of the main thread for iOS?

标签 objective-c core-animation ios calayer nsthread

绘图/绘画应始终在 GUI 线程上完成,否则可能会发生死锁!...

您如何确定调用是否会导致 iOS 主线程的不安全绘制?

问题是我们得到这样的堆栈,它不在主线程上......

#19 0x02a788d2 in -[CALayer drawInContext:]
#20 0x02a784b0 in backing_callback
#21 0x02a77d52 in CABackingStoreUpdate
#22 0x02a7701d in -[CALayer _display]
#23 0x02a76ac7 in CALayerDisplayIfNeeded
#24 0x02a689e1 in CA::Context::commit_transaction
#25 0x02a68732 in CA::Transaction::commit
#26 0x02aa604f in CA::Transaction::release_thread
#27 0x918b21e3 in _pthread_tsd_cleanup
#28 0x918b1df6 in _pthread_exit
#29 0x0018bbf2 in +[NSThread exit]
#30 0x0018bb5b in __NSThread__main__
#31 0x918a981d in _pthread_start
#32 0x918a96a2 in thread_start

如何确定您是否会导致这种情况? 是否有任何调试提示或其他技术可以在您做错事情时提醒自己。

最佳答案

我很惊讶地发现 setNeedsDisplay 不会自动将绘图排队到主线程中....

似乎当我从后台线程使用 performSelectorOnMainThread:@selector(setNeedsDisplay) 时,它不会像上面那样产生一个堆栈,而是在主线程上绘制它应该的样子。

当从后台线程调用 setNeedsDisplay 时,为什么它不在主线程上排队重新绘制可能是有充分理由的。我正在考虑通过我的所有代码并确保从主线程调用 setNeedsDisplay 或者是否可以为 UIView 创建一个类别:setNeedsDisplay 它将在调用 setNeedsDisplay 之前检查当前线程是否是主线程否则它将在主线程上重新运行 setNeedsDisplay。

免责声明...我没有读到它是如何工作的,我是通过测试发现的。

关于objective-c - 死锁 : How do you determine if a call may cause unsafe painting off of the main thread for iOS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3637454/

相关文章:

IOS,swift - UICollectionReusableView 不工作

iphone - 我需要在xcode4.2中恢复dealloc吗?

ios - 如何获取 TableView 的第一个单元格?

iphone - Xcode 3.2.4 分析器跳过了这个文件?

ios - 正确管理addObserverForName :object:queue:usingBlock:

iphone - CALayer/CABasicAnimation 不透明动画缓存?

iphone - 如何在iOS中从 View 顶部添加带有拖动动画的 subview ?

macos - 将NSImageView的CALayer旋转90度

ios - 如何检查一个词是否在 Objective-C 中的短语中

ios - 我可以在 iOS 上指定 AutoLayout 约束以间隔到最近的可见邻居吗?