绘图/绘画应始终在 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/