如何重构我的代码以在主线程上调用 AppDelegate?
How do I refactor my code to call AppDelegate on the main thread?
我最近开始将我的项目从 Swift3/Xcode8 迁移到 Swift4/Xcode9。我的应用程序在运行时崩溃,因为主线程清理器只允许在主线程上访问 UIApplication.shared.delegate
,导致启动时崩溃。我有以下代码,在 Swift 3 -
中运行良好
static var appDelegate: AppDelegate {
return UIApplication.shared.delegate as! AppDelegate;
}
我代码中的其他 类 可以访问 appDelegate。我需要想办法从主线程 return UIApplication.shared.delegate
。
注意:从访问 appDelegate
的任何地方使用 DispatchQueue.main.async{}
块不是一种选择。只需要在 static var appDelegate
声明中使用它。
寻找巧妙的解决方法。
相关崩溃信息:
Main Thread Checker: UI API called on a background thread: -[UIApplication delegate]
PID: 1094, TID: 30824, Thread name: (none), Queue name: NSOperationQueue 0x60400043c540 (QOS: UNSPECIFIED), QoS: 0
使用调度组解决。
static var realDelegate: AppDelegate?;
static var appDelegate: AppDelegate {
if Thread.isMainThread{
return UIApplication.shared.delegate as! AppDelegate;
}
let dg = DispatchGroup();
dg.enter()
DispatchQueue.main.async{
realDelegate = UIApplication.shared.delegate as? AppDelegate;
dg.leave();
}
dg.wait();
return realDelegate!;
}
并在其他地方调用它
let appDelegate = AppDelegate(). realDelegate!
我使用以下:
static var shared: AppDelegate? {
if Thread.isMainThread {
return UIApplication.shared.delegate as? AppDelegate
}
var appDelegate: AppDelegate?
DispatchQueue.main.sync {
appDelegate = UIApplication.shared.delegate as? AppDelegate
}
return appDelegate
}
我最近开始将我的项目从 Swift3/Xcode8 迁移到 Swift4/Xcode9。我的应用程序在运行时崩溃,因为主线程清理器只允许在主线程上访问 UIApplication.shared.delegate
,导致启动时崩溃。我有以下代码,在 Swift 3 -
static var appDelegate: AppDelegate {
return UIApplication.shared.delegate as! AppDelegate;
}
我代码中的其他 类 可以访问 appDelegate。我需要想办法从主线程 return UIApplication.shared.delegate
。
注意:从访问 appDelegate
的任何地方使用 DispatchQueue.main.async{}
块不是一种选择。只需要在 static var appDelegate
声明中使用它。
寻找巧妙的解决方法。
相关崩溃信息:
Main Thread Checker: UI API called on a background thread: -[UIApplication delegate] PID: 1094, TID: 30824, Thread name: (none), Queue name: NSOperationQueue 0x60400043c540 (QOS: UNSPECIFIED), QoS: 0
使用调度组解决。
static var realDelegate: AppDelegate?;
static var appDelegate: AppDelegate {
if Thread.isMainThread{
return UIApplication.shared.delegate as! AppDelegate;
}
let dg = DispatchGroup();
dg.enter()
DispatchQueue.main.async{
realDelegate = UIApplication.shared.delegate as? AppDelegate;
dg.leave();
}
dg.wait();
return realDelegate!;
}
并在其他地方调用它
let appDelegate = AppDelegate(). realDelegate!
我使用以下:
static var shared: AppDelegate? {
if Thread.isMainThread {
return UIApplication.shared.delegate as? AppDelegate
}
var appDelegate: AppDelegate?
DispatchQueue.main.sync {
appDelegate = UIApplication.shared.delegate as? AppDelegate
}
return appDelegate
}