Swift viewWillAppear延迟了

时间:2016-04-08 17:41:57

标签: ios swift lifecycle

过去5个小时我正在尝试修复此错误。我有两个VC。在第一个VC中有一个触发segue的轻击手势。

@IBAction func addMaterial(sender: AnyObject){
        dispatch_async(dispatch_get_main_queue()) {
            self.performSegueWithIdentifier("addNewMaterialSegue", sender: self)
        }
    }

第二个VC:

override func viewDidLoad() {
     dispatch_async(dispatch_get_main_queue()) {
        super.viewDidLoad()
        print("viewDidLoad")
    }
}


override func viewWillAppear(animated: Bool) {
    print("viewWillAppear")
    super.viewWillAppear(animated)
 }

从viewDidLoad到viewWillAppear需要大约5个秒。我知道I'm not the first to ask this question,但我找不到与“创建和呈现视图控制器应该在主线程上完成”不同的解决方案,而不是我的情况。

2 个答案:

答案 0 :(得分:6)

删除dispatch_async。

您使用dispatch_async告诉处理器的是

  • 正如你所说:是的,请在主线程上运行它,因为这是与UI相关的东西。这很好。
  • async说:亲爱的处理器,继续处理还有什么需要做的事情 - 这可能是一件好事,因为你的viewDidLoad可能还有很多其他的东西要做,
  • 然而,不幸的是,在整个视图创建和显示过程中,事情依赖于彼此,可以理解。如果视图没有加载(通过super.viewDidLoad()),那么VC当然也不能准备出现的视图。
  • 最后,dispatch_async可以获得几个优先级。如果您未明确指定,则很可能不会获得最高优先级。所以很多其他事情将优先于处理器的调用。

长话短说,删除dispatch_async,你的延迟就会消失。

答案 1 :(得分:4)

删除示例代码中的dispatch_async。你已经在主要队列。

修改

好吧,我要道歉。我已经尝试过您的代码,但找不到任何问题。乍一看,您在主队列中已经执行的dispatch_async调用看起来非常可疑。我仍然认为他们必须被删除。但它们不会导致您遇到的问题。即使您将调用放在dispatch_async中,视图也会快速打开,没有任何延迟。所以,还有另一个问题。也许你可以提供更多信息,更多代码或最佳:整个项目。那么应该很容易找到问题。

如果您无法放弃该项目,可以进行此项检查:

print("Current thread \(NSThread.currentThread())")

将其放在每个相关功能的每个条目上。让我们看看当前发生的各种情况。