Ios 在后台异步显示视图控制器

Ios 在后台异步显示视图控制器,ios,swift,background,presentviewcontroller,Ios,Swift,Background,Presentviewcontroller,我发送一个异步请求,并在收到成功消息时提供一个视图控制器。它起作用了 但当我的应用程序在后台时,当我收到成功并在前台传递时,我遇到了一个问题。视图控制器并不总是显示 我想是关于主线的,但我不确定 我怎样才能修好它 编辑: 下面是我在成功后调用的函数: func showPopup(on viewController: UIViewController) { let viewControllerToPresent = MyPopupViewController(nibName: "Popu

我发送一个异步请求,并在收到成功消息时提供一个视图控制器。它起作用了

但当我的应用程序在后台时,当我收到成功并在前台传递时,我遇到了一个问题。视图控制器并不总是显示

我想是关于主线的,但我不确定

我怎样才能修好它

编辑:

下面是我在成功后调用的函数:

func showPopup(on viewController: UIViewController) {
    let viewControllerToPresent = MyPopupViewController(nibName: "Popup", bundle: nil)

    let popup = PopupDialog(viewController: viewControllerToPresent, buttonAlignment: .horizontal, transitionStyle: .zoomIn, gestureDismissal: false)

    let button = DefaultButton(title: "Ok") {
        popup.dismiss(animated: true, completion: nil)
    }

    popup.addButtons([button])
    viewController.present(popup, animated: true, completion: nil)
}

如果从后台调用UI函数,结果是不可预测的。只是显式地出现在主线程上。以下是一个简化的示例:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.doBackgroundStuff()
    }

    func getThread() -> String {
        return Thread.isMainThread ? "UI" : "BG"
    }

    func doBackgroundStuff() {
        // force to background
        DispatchQueue.global().async {
            print("doBackgroundStuff: this is the \(self.getThread()) thread")
            self.showPopup(on: self)
        }
    }

    func showPopup(on viewController: UIViewController) {
        print("showPopup OUTER: this is the \(self.getThread()) thread")
        // force to foreground
        DispatchQueue.main.sync {
            print("showPopup INNER: this is the \(self.getThread()) thread")
            let popup = PresentingViewController(nibName: "PresentingViewController", bundle: nil)
            viewController.present(popup, animated: true, completion: nil)
        }
    }
}
显示UI,控制台上的输出为:

doBackgroundStuff: this is the BG thread
showPopup OUTER: this is the BG thread
showPopup INNER: this is the UI thread

当您的应用程序处于后台(即挂起)时,苹果不允许您对用户界面进行任何更改。在这种情况下,您最好的方法可能是保存您想要在返回时执行的操作,并签入您的应用程序委托
applicationdidebecomeactive
方法。

代码在哪里?您尝试了什么?上面的代码没有显示在后台调用的任何内容。请出示所有相关代码。感谢没有其他相关代码。调用
showPopup
的代码是相关的。
showPopup
在我的异步请求成功时被调用。我的问题是,在异步请求过程中,当应用在后台时,你不能期望在应用在后台时显示视图控制器。这与苹果的指导方针背道而驰。是的,如果应用程序在后台,我想我会保存,在前台添加一个观察者,然后做我的事情。谢谢你的回答:)