Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS在后台线程上访问UI屏幕_Ios_Multithreading_Uikit_Grand Central Dispatch_Retina - Fatal编程技术网

iOS在后台线程上访问UI屏幕

iOS在后台线程上访问UI屏幕,ios,multithreading,uikit,grand-central-dispatch,retina,Ios,Multithreading,Uikit,Grand Central Dispatch,Retina,我有一个方法负责加载事件的详细信息(查询sqlite数据库中的标题、描述、缩略图路径等),因为我需要为大量事件调用它,所以我使用Grand Central Dispatch将其分派到后台线程 问题是我得到了一个UIKit线程异常(让我知道我正在主线程以外的线程上运行UI方法,导致应用程序崩溃)。我根本没有改变UI,所以这几乎是不可能找到的,但我最终将其缩小为一行代码: bool retina = (UIScreen.MainScreen.Scale > 1.0); 我正在使用UIScre

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

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

bool retina = (UIScreen.MainScreen.Scale > 1.0);
我正在使用UIScreen确定设备是否有视网膜屏幕(确定缩略图路径是否应在末尾附加“@2x”),仅访问此屏幕(看起来是静态变量)就会引发UIKit异常

是否有办法确定屏幕是否是不使用UIKit的视网膜(或者是后台线程安全的),或者是否有更好的方法来解决这个问题


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

首先,打开屏幕上显示的图像时,不必指定
@2
。iOS使用
UIImage(名为:“BaseName”)
选择正确的版本

但如果您需要在这里输入您的Swift代码:

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

    return scale > 1.0
}

因为你在很多地方使用它,考虑把它放在一些实用程序/基类中。

你不能只在启动(即主线程)上设置变量一次,然后使用它吗?我想到了,但是这个方法在很多不同的地方被调用,它需要大量的重构。除非我在启动时设置了一个单例来确定这一点,但仅仅为了确定屏幕是否是视网膜,这会是一种过分的做法吗?或者这是一个好主意吗?关于:“不同的地方”,您是否有特定的对象类型来管理数据加载?它是在主线程上初始化的吗?(否则,我不知道Xamarin体系结构,但在“Xcode”应用程序中,我会尝试将其作为应用程序委托的一个属性——不是完美的,但对于单个变量来说是合理的。)完全忘记了在Grand Central Dispatch中可能有阻塞调用。完美的回答很乐意帮忙。你也可以随意增加答案:-)(或者你不能用100分以上的分数吗?)