如何重构我的代码以在主线程上调用AppDelegate?

ent*_*mum 9 multithreading ios swift swift4

我最近开始将我的项目从Swift3/Xcode8迁移到Swift4/Xcode9.我的应用程序在运行时崩溃,因为主线程清理程序UIApplication.shared.delegate只允许访问主线程,导致启动时崩溃.我有以下代码,在Swift 3中工作正常 -

static var appDelegate: AppDelegate {
    return UIApplication.shared.delegate as! AppDelegate;
}
Run Code Online (Sandbox Code Playgroud)

我的代码中的其他类可以访问appDelegate.我需要找出一种UIApplication.shared.delegate从主线程返回的方法.

注意:DispatchQueue.main.async{}在任何访问位置使用块appDelegate都不是一种选择.只需在static var appDelegate声明中使用它.

寻找一个聪明的解决方法.

相关的崩溃消息:

主线程检查器:在后台线程上调用的UI API: - [UIApplication delegate] PID:1094,TID:30824,线程名称:(无),队列名称:NSOperationQueue 0x60400043c540(QOS:UNSPECIFIED),QoS:0

ent*_*mum 9

使用Dispatch Groups解决.

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!;
}
Run Code Online (Sandbox Code Playgroud)

并将其称为其他地方

let appDelegate = AppDelegate(). realDelegate!
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案与Debaprio B的解决方案有什么区别? (3认同)