2013-03-27 54 views
3

问题是:如何在没有UI线程的iOS MonoTouch(如UIScreen.MainScreen.Bounds)中获得屏幕分辨率? 酒店.MainScreen抛出一个异常在MonoTouch中获取没有UI的iOS屏幕分辨率

UIKit Consistency error: you are calling a UIKit method that can only be invoked from the UI thread. 

因此我需要一个UI线程。但是由于在加载应用程序之前需要解析,因此在调用UIApplication.Main()之前,UIApplication.mainThread(由调试器显示的私有成员)为null。由于没有用户界面,我假设根本没有UI线程。所以我在技术上不能在任何对象上调用InvokeOnMainThread

是否有任何其他方式获得屏幕分辨率没有UIScreen.MainScreen?如果不是,我将不得不将初始化移动到从UI调用的一些代码。那么还有另外一个问题:我如何从任意线程获取任何UI对象(称为InvokeOnMainThread)?我无法控制UI代码。

回答

3

UI线程检查是optional并且可以全局或本地禁用。后者(本地)选项似乎适合您的需要。

以下代码将关闭检查,获取边界并重新启用检查(如果它以前启用)。

bool check_ui = UIApplication.CheckForIllegalCrossThreadCalls; 
UIApplication.CheckForIllegalCrossThreadCall = false; 
var screen_bounds = UIScreen.MainScreen.Bounds; 
UIApplication.CheckForIllegalCrossThreadCalls = check_ui; 
+0

它的工作!如果我对MainScreen不做任何处理,但是读取“Bounds”,它是否是线程安全的? – Aneri 2013-03-27 19:59:46

+0

这是**不是**线程安全的,但如果你在调用'UIApplication.Main()'之前这样做了,那么你可能*(如果你没有创建一些线程)在** main **线程 - 这将是UI线程(但我们的支票尚未初始化)。 – poupou 2013-03-27 21:37:23

+0

谢谢你的解释。我的确在主线上。但我想知道为什么阅读(不变)值不是线程安全的?我明白为什么(可能)'.MainWindow'' get'不是线程安全的:我可以用它做各种事情。也许'MainScreen'的'get'做了一些非线程安全的事情? – Aneri 2013-03-28 15:04:23

1

我不知道第一个问题,但对于第二个问题“如何从任意线程获取任何UI对象(调用InvokeOnMainThread)?”,那么这个怎么办?

new NSObject().InvokeOnMainThread(() => { 
    //call UI specific stuff 
}); 
+0

谢谢!不知道NSObject是否聪明,它知道关于UI线程而不管创建方法。 – Aneri 2013-03-27 20:00:40