iOS 在后台线程上访问 UIScreen

iOS Accessing UIScreen on Background Thread

我有一个方法负责加载有关事件的详细信息(查询 sqlite 数据库中的标题、描述、缩略图路径等),因为我需要为大量事件调用它,所以我我正在使用 Grand Central Dispatch 调度到后台线程。

问题是我遇到 UIKit 线程异常(让我知道我在主线程以外的线程上使用 运行 UI 方法,导致应用坠毁)。我根本没有改变 UI 所以这几乎不可能找到,但我最终将它缩小到一行代码:

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

我正在使用 UIScreen 来确定设备是否有视网膜屏幕(以确定缩略图图像路径是否应该在末尾附加“@2x”)并且只是访问它(看起来是一个静态变量)抛出 UIKit 异常。

是否有 work-around 用于确定屏幕是否为不使用 UIKit 的视网膜(或者 background-thread 安全),或者是否有更好的计算方法这个出来了?

注意:我正在使用 Xamarin (C#) 创建应用程序,但 swift 中的任何答案都非常好并且易​​于转换。

首先,您不必在打开仅显示在屏幕上的图像时指定 @2。 iOS 使用 UIImage(named: "BaseName") 选择正确的版本。

但如果您需要,请在此处查看您的 Swift 代码:

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

    return scale > 1.0
}

因为你在很多地方用到它,考虑把它放在一些utility/base class.