我的项目中有一个错误(已经第二次见到了),我只在UIViewController的视图顶部添加了一个视图。没什么特别的,像这样:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.displayEmailNotificationsIfNeeded()
}


该错误是由于某种原因,“自动版式”无法正常工作,并且没有将其添加到顶部,但比所需的水平低60pt。我怀疑〜60pt来自手动顶部约束调整,以包括导航栏和状态栏,但这并不是很重要。

事实是,如果我在主队列上显式运行该方法,问题就会消失,如下所示:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    print("is main thread: ", NSThread.isMainThread())
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        print("is main thread inside block: ", NSThread.isMainThread())
        self.displayEmailNotificationsIfNeeded()
    })
}


两种情况下,打印语句均返回true。这并不是很糟糕,但是出于好奇,我想了解是什么原因造成的。有没有一种方法可以调试这种情况并理解为什么在主线程上显式执行操作可以修复某些UI毛刺?

最佳答案

有根据的猜测-除非您没有将displayEmailNotificationsIfNeeded明确地添加到队列中,否则不是viewDidAppear不在主线程上运行,这更多是时间问题。一旦viewDidAppear完成执行,故事板中的其他约束可能会导致元素移动,而这些约束处于不同状态。异步添加执行块可以使在执行代码之前完成(以及在主队列上同步运行的所有其他内容)。

希望这可以帮助。

关于swift - 尽管UI操作在主线程上运行,但UI仍存在故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36848723/

10-09 16:14