UIKit绘图是线程安全的:如何获取图形上下文?

9
所以,如此答案iOS 4.0版本说明中所述,UIKit现在具有一些线程安全的绘图功能:

使用UIKit绘制图形上下文现在是线程安全的。 具体而言:

  • 用于访问和操作图形上下文的程序现在可以正确处理位于不同线程上的上下文。
  • 字符串和图像绘制现在是线程安全的。
  • 在多个线程中使用颜色和字体对象现在是安全的。
这很棒,但是怎么使用呢?
据我所知,除了在-drawRect:内部以外,在任何时候,如果你通过UIGraphicsBeginImageContext()UIGraphicsPushContext()创建自己的上下文,就只能使用UIKit/UIGraphics进行绘制,但是根据文档,这些函数不是线程安全的,并且-drawRect()总是在主线程上调用。
我认为,在主线程上创建图像上下文,然后启动后台方法会是一个非常糟糕的想法,因为会有很多竞争条件。
那么,我该如何使用iOS 4中引入的基于UIKit的多线程绘图功能?还有其他获得活动UIKit图形上下文的方法吗?
附言:我知道我可以使用Core Graphics进行绘制并完成它。由于各种原因(遗留代码),我想继续使用基于UIKit的绘图方法。
1个回答

8

根据我的经验和各种文件,我认为UIGraphicsPushContext()的文档是不正确的。

我相信UIGraphicsPushContext()实际上是线程安全的。表明这一点的具体迹象是QA1637,它说“从iOS 4.0开始,在UIKit中绘制图形上下文是线程安全的。这包括访问和操作当前图形堆栈,绘制图像和字符串以及在辅助线程中使用颜色和字体对象。” (强调是我的)

我承认,在与文档相矛盾的情况下假设线程安全总是一个冒险的建议。但我认为这是文档错误。我已打开rdar:// 11161530进行跟踪。请复制。


我刚刚在DTS上提了一个问题,希望能从那里找到答案。我在问题中没有提到的是,在我的测试中(虽然我使用的是...beginImageContext),大部分时间都运行正常,但有时会在NSString drawInRect:withFont:中崩溃。这很让人烦恼,因为它不容易重现,但每当它崩溃时,它就在那里。我正在努力弄清楚我是否做错了什么,或者这只是永远无法解决的问题。 - Amy Worrall
我以前没有见过这种崩溃,但我的实验并不过于激进。这非常令人不安,可能表明我的信念是错误的。请告诉我们DTS的结果。 - Rob Napier
1
啊...记住,UIWebView绝对不是线程安全的。我不会尝试在主线程之外对Web视图执行任何操作。关于此的更多讨论:https://dev59.com/pVPTa4cB1Zd3GeqPiE0F - Rob Napier
2
我开始认为这可能是框架中的一个错误。虽然还不确定,但我们相信崩溃只会在需要字体替换时发生:我们的一些文本包含了细小的空格字符,而这些字符在我们想要使用的字体中并不存在。删除这些有问题的字符似乎可以解决问题。等DTS回复后,我会向他们报告此事。 - Amy Worrall
你从DTS那里听到回复了吗?我们遇到了完全相同的问题。在后台线程中调用NSString drawInRect会导致偶尔崩溃,因为它最终通过WebKit进行绘制。 - A. Z.
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接