首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift viewWillAppear延迟

Swift viewWillAppear延迟
EN

Stack Overflow用户
提问于 2016-04-08 17:41:57
回答 2查看 766关注 0票数 3

五个小时过去了,我正试着修复这个错误。我有两个VC。在第一个VC中有一个触发segue的点击手势。

代码语言:javascript
复制
@IBAction func addMaterial(sender: AnyObject){
        dispatch_async(dispatch_get_main_queue()) {
            self.performSegueWithIdentifier("addNewMaterialSegue", sender: self)
        }
    }

第二次“维也纳公约”:

代码语言:javascript
复制
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,但我没有找到与“创建和呈现视图控制器应该在主线程上完成”不同的解决方案,而且ś不是我的情况。

EN

回答 2

Stack Overflow用户

发布于 2016-04-08 18:30:39

删除分派的异步文件。

你用dispatch_async告诉处理器的是

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

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

票数 6
EN

Stack Overflow用户

发布于 2016-04-08 17:58:18

在示例代码中的任何地方删除dispatch_async。您已经在主队列中了。

编辑:

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

如果你不能放弃这个项目,你可以做这个检查:

代码语言:javascript
复制
print("Current thread \(NSThread.currentThread())")

把这个放在每一个相关功能的每个条目上。让我们来看看目前在哪种情况下发生的一切。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36506024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档