UImage.AsPNG()
线程是否安全?在单独的线程中使用Xamarin.iOS 6.3.5.43中的UImage.AsPNG()
时,我得到了MonoTouch.UIKit.UIKitThreadAccessException
。
从Apple文档中我看不出这个方法需要在主线程上执行。
我没有在6.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可能会有所帮助。