UImage.AsPNG()线程安全吗?

时间:2013-06-04 12:37:53

标签: xamarin.ios uikit

UImage.AsPNG()线程是否安全?在单独的线程中使用Xamarin.iOS 6.3.5.43中的UImage.AsPNG()时,我得到了MonoTouch.UIKit.UIKitThreadAccessException。 从Apple文档中我看不出这个方法需要在主线程上执行。 我没有在6.2分支中得到这个警告。

2 个答案:

答案 0 :(得分:3)

是的,它是线程安全的,并已在recently released Xamarin.iOS 6.2.7.

中修复

问题是我们与Apple工程师就线程安全API进行了讨论,当我们查看他们提供给我们的信息时,我们犯了一个错误。 bug report中提供了更多信息。

答案 1 :(得分:1)

  

从Apple文档中我看不出这个方法需要在主线程上执行

Apple没有为UIKit指定每个方法的线程安全性。相反,this disclaimer在主框架参考中给出:

  

注意:在大多数情况下,UIKit类只能从应用程序的主线程中使用。对于从UIResponder派生的类或者涉及以任何方式操纵应用程序的用户界面的类,尤其如此。

回到原来的问题 - MonoTouch会在调试版本上抛出UIKitThreadAccessException。它旨在作为检查/调试工具,以确保您没有在辅助线程上执行UIKit的东西。

因为从iOS 4开始,某些UIKit方法(主要涉及绘制到图形上下文的方法)变得线程安全,所以MonoTouch不会抛出此异常的方法白名单,可以在MonoTouch文档中找到。

我不能说UIImage.AsPNG()是否是线程安全的......我不认为是,但如果我错了 - 或者你想要冒险 - 你可以通过--disable-thread-check标志禁用MonoTouch的自动UIKit后台线程检查。 This blog post可能会有所帮助。