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

时间:2017-08-23 06:29:23

标签: ios swift multithreading swift4

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

static var appDelegate: AppDelegate {
    return UIApplication.shared.delegate as! AppDelegate;
}

我的代码中的其他类可以访问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

2 个答案:

答案 0 :(得分: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!;
}

并在其他地方调用

let appDelegate = AppDelegate(). realDelegate!

答案 1 :(得分:1)

我使用以下内容:

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
    }