Ios 主队列上的事件按相反顺序显示

Ios 主队列上的事件按相反顺序显示,ios,swift,multithreading,Ios,Swift,Multithreading,我有几个函数可以在UIViewController中显示加载程序覆盖视图 func showLoader() { let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate let window = appDelegate.window! loader = LoaderView(frame: window.bounds) window.

我有几个函数可以在UIViewController中显示加载程序覆盖视图

 func showLoader() {
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let window = appDelegate.window!

        loader = LoaderView(frame: window.bounds)
        window.addSubview(loader!)

        loader?.start()
    }

    func hideLoader() {
        loader?.removeFromSuperview()
        loader?.stop()
        loader = nil
        print("hide loader")
    }
我还使用showAlert功能扩展了UIViewController:

 func showAlert(title title: String, message: String, cancelButton: Bool, action:((UIAlertAction) -> Void)?)  {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
        alert.addAction(UIAlertAction(title: Localized.OK, style: UIAlertActionStyle.Default, handler: action))

        if (cancelButton) {
            alert.addAction(UIAlertAction(title: Localized.CANCEL, style: .Cancel, handler: nil))
        }
        self.presentViewController(alert, animated: true, completion: nil)
    }
然后我使用它如下:

self.showLoader()

DataManager.createGambler(room.id, module: module, team: team) { code, gamblerId in
    dispatch_async(dispatch_get_main_queue()) {
        self.hideLoader()
        self.showAlert(title: Localized.ERROR, message: "No network connection available.", cancelButton: false, action: nil)
      }
}
DataManager.createGambler是对在后台队列上运行的web服务的异步调用

问题在于,在加载程序隐藏后,警报视图应该显示出来,相反,情况正好相反

我如何确保我保持在主队列上,但确保事件的顺序:1)隐藏加载程序;2) 保持警惕

我尝试过使用后台队列、交互式队列,向hideLoader()添加完成块,但似乎什么都不起作用?这样做有共同的模式吗

我还尝试使用dispatch_sync,但这会破坏运行时,导致崩溃

这是结果,加载程序仍在显示,警报视图已在下面。我希望警报仅在加载程序隐藏时显示


你的问题不是很清楚。加载程序是否按预期显示,并且在
createGambler
中的后台进程完成时,加载程序是否保持原位?后台处理完成后,是否隐藏加载程序视图并显示警报?用事件的确切顺序更新你的问题,并解释它与你想要的有什么不同。事实上,我现在做了编辑,我相信现在已经很清楚了,不是吗?加载程序显示,但在它隐藏之前,警报视图已经显示。您的注释比您在问题中所写的要清楚得多。请在加载程序?处添加断点。removeFromSuperview()。这是否正确执行?可能加载器为零且从未被删除。@stefos加载器被删除时,始终打印“隐藏加载器”。太晚了…你的问题不是很清楚。加载程序是否按预期显示,并且在
createGambler
中的后台进程完成时,加载程序是否保持原位?后台处理完成后,是否隐藏加载程序视图并显示警报?用事件的确切顺序更新你的问题,并解释它与你想要的有什么不同。事实上,我现在做了编辑,我相信现在已经很清楚了,不是吗?加载程序显示,但在它隐藏之前,警报视图已经显示。您的注释比您在问题中所写的要清楚得多。请在加载程序?处添加断点。removeFromSuperview()。这是否正确执行?可能加载器为零且从未被删除。@stefos加载器被删除时,始终打印“隐藏加载器”。太晚了。。。