UImage.AsPNG()
线程安全吗?从单独的线程在 Xamarin.iOS 6.3.5.43 中使用UImage.AsPNG()
时,我得到一个MonoTouch.UIKit.UIKitThreadAccessException
. 从 Apple 文档中,我看不到需要在主线程上执行此方法。我在 6.2 分支中没有收到此警告。
2 回答
是的,它是线程安全的,并且已在最近发布的 Xamarin.iOS 6.2.7 中得到修复。
问题是我们与 Apple 工程师讨论了线程安全 API,当我们查看他们提供给我们的信息时,我们犯了一个错误。错误报告中提供了更多信息。
从Apple docs我看不出这个方法需要在主线程上执行
Apple 没有为UIKit
. 相反,此免责声明在主要框架参考中给出:
注意:在大多数情况下,UIKit 类只能在应用程序的主线程中使用。对于从 UIResponder 派生的类或涉及以任何方式操作应用程序的用户界面的类尤其如此。
回到你原来的问题 - UIKitThreadAccessException
MonoTouch 在调试版本中抛出。它旨在用作检查器/调试工具,以确保您没有在辅助线程上执行 UIKit 工作。
因为从 iOS 4 开始,某些 UIKit 方法(主要是那些涉及绘制到图形上下文的方法)成为线程安全的,所以 MonoTouch 不会为其抛出此异常的方法的白名单可以在 MonoTouch 文档中找到。
我不能说是否UIImage.AsPNG()
是线程安全的......我不认为它是,但如果我错了 - 或者你想冒险 - 你可以传递--disable-thread-check
标志来禁用 MonoTouch 的自动 UIKit 后台线程检查。这篇博文可能会有所帮助。