2017-07-28 95 views
2

我有一個負責加載有關事件的詳細信息(查詢sqlite數據庫的標題,描述,縮略圖路徑等)的方法,因爲我需要調用這個大量的我正在使用Grand Central Dispatch調度到後臺線程。iOS在後臺線程上訪問UIScreen

問題是我得到一個UIKit線程異常(讓我知道我在除主線程以外的線程上運行UI方法,導致應用程序崩潰)。我不會改變的UI在所有所以這是幾乎不可能找到,但我最後把範圍縮小到一行代碼:

bool retina = (UIScreen.MainScreen.Scale > 1.0); 

我使用UIScreen以確定設備是否有視網膜屏幕(以確定縮略圖圖像路徑是否應該在末尾附加「@ 2x」),並且只是訪問它(看起來是一個靜態變量)會引發該UIKit異常。

是否有解決方法來確定屏幕是否不使用UIKit(或後臺線程安全)的視網膜,還是有更好的方法來解決這個問題?

注意:我使用Xamarin(C#)來創建應用程序,但在swift中的任何答案都非常好,並且易於轉換。

+1

難道你只是在啓動時(即主線程)設置一次變量,然後使用它? –

+0

我想到了,但是這個方法在很多不同的地方被調用,所以需要大量的重構。除非我設置了一個確定啓動時間的單身人士,但如果屏幕是視網膜,會不會過度呢?或者這是一個好主意? –

+0

回覆:「不同的地方」你有一個特定的對象類型來管理數據加載嗎?它是否在主線程上初始化? (否則,我不知道Xamarin體系結構,但是在「Xcode」應用程序中,我很想讓它成爲應用程序委託的屬性 - 對於單個變量來說不完美但合理。) –

回答

2

首先,您不必在打開屏幕上顯示的圖像時指定@2。 iOS使用UIImage(named: "BaseName")選擇正確的版本。

但是如果你需要在這裏你的銀行代碼:

func isRetina() -> Bool 
{ 
    var scale: CGFloat = 0.0 
    DispatchQueue.main.sync 
    { 
     scale = UIScreen.main.scale 
    } 

    return scale > 1.0 
} 

因爲你在很多地方使用它,可以考慮把這個在一些工具/基類。

+0

完全忘記了你可以在Grand Central Dispatch中阻止呼叫。完美答案 –

+1

很高興幫助。隨意也可以回答:-)(或者你不能以100+分的方式做到這一點?) –