2

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

4

2 回答 2

3

是的,它是线程安全的,并且已在最近发布的 Xamarin.iOS 6.2.7 中得到修复。

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

于 2013-06-04T12:56:38.737 回答
1

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

Apple 没有为UIKit. 相反,此免责声明在主要框架参考中给出:

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

回到你原来的问题 - UIKitThreadAccessExceptionMonoTouch 在调试版本中抛出。它旨在用作检查器/调试工具,以确保您没有在辅助线程上执行 UIKit 工作。

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

我不能说是否UIImage.AsPNG()是线程安全的......我不认为它是,但如果我错了 - 或者你想冒险 - 你可以传递--disable-thread-check标志来禁用 MonoTouch 的自动 UIKit 后台线程检查。这篇博文可能会有所帮助。

于 2013-06-04T12:44:39.320 回答