iOS在后台线程

时间:2017-07-28 18:16:27

标签: ios multithreading uikit grand-central-dispatch retina

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

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

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

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

是否有解决方案来确定屏幕是否是不使用UIKit(或背景线程安全)的视网膜,还是有更好的方法来解决这个问题?

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

1 个答案:

答案 0 :(得分:3)

首先,打开刚刚在屏幕上显示的图像时,您不必指定@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
}

因为您在很多地方使用它,请考虑将其放在某个实用程序/基类中。