iOS在后台线程上访问UI屏幕
我有一个方法负责加载事件的详细信息(查询sqlite数据库中的标题、描述、缩略图路径等),因为我需要为大量事件调用它,所以我使用Grand Central Dispatch将其分派到后台线程 问题是我得到了一个UIKit线程异常(让我知道我正在主线程以外的线程上运行UI方法,导致应用程序崩溃)。我根本没有改变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
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分以上的分数吗?)