2013-06-04 158 views
2

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

+0

UIKit中的任何内容都不是线程安全的。 – 2013-06-04 12:40:49

+0

@ H2CO3“在UIKit中绘制图形上下文现在是线程安全的”:http://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iPhoneOS4.html#//apple_ref/doc/ UID/TP40009559-SW29 – Krumelur

回答

3

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

的问题是,我们必须与有关线程安全的API苹果工程师的讨论,我们犯了一个错误,当我们通过去他们给我们的信息。有关更多信息,请参阅bug report

1

从苹果的文档我看不到所需此方法可以在主线程

苹果不指定每个方法的线程安全性UIKit上执行。 this disclaimer在主框架参考中给出:

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

回到原来的问题 - UIKitThreadAccessException由MonoTouch调试构建引发。它的目的是作为一个检查/调试工具,以确保你没有在辅助线程上做UIKit的东西。

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

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