2013-03-27 45 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