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.
我有一个方法负责加载有关事件的详细信息(查询 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.