在显示新视图之前,iOS segue冻结了几秒钟

Pao*_*ini 15 uiviewcontroller ios segue uistoryboardsegue swift

在我的应用程序的主视图中,我有一个表视图和两个原型单元格.我使用故事板为每个单元配置了segue.在视图控制器中,我覆盖prepareForSegue以将所选单元格上的信息传递到目标视图.

目标视图不是特别复杂,当然也不需要任何繁重的处理来加载.

问题

当我第一次点击主控制器中的单元格时,目标视图会在长时间延迟后显示,从5到40秒.

编辑#2:后续的点击通常更快

注意:

  • 如果在目标视图出现之前再次点击同一单元格,则会触发目标视图立即显示.
  • 如上所述,但是点击不同的单元格会导致视图立即显示,但会显示来自第一个单元格的数据.
  • 如上所述,但是点击不同的控件(没有关联的segues)会触发目标视图立即显示.
  • 随后的"轻敲"通常表现出较少的延迟.
  • Time Profiler - 我能看到的 - 表明在那么多秒的延迟期间绝对没有发生任何事情.
  • 我尝试过不同类型的segue,但没有区别
  • 一些println显示以下事件序列发生:

    • 在主视图中,执行prepareForSegue(没有延迟)
    • 然后执行目标viewDidLoad(没有延迟)
    • ......长时间拖延......
    • 目标控制器中的集合和表视图开始调用与数据源相关的方法以从控制器获取数据.
    • 视图终于出现了(带有不需要的动画,BTW,但这是一个不同的问题)

根据我在这个主题上的内容,我怀疑这个问题可能与后台线程中发生的一些上述操作有关.

知道我可能做错了什么吗?

编辑#1:添加了一些代码

在主视图控制器中,segue已使用故事板链接(CTRL-将两个原型单元拖动到目标视图中).

代码看起来有点像下面:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
    var assetIndex = assetsTable.indexPathForSelectedRow()?.row

    println("prepare for segue - start: \(assets[assetIds[assetIndex!]]!.Name)")

    if let destination = segue.destinationViewController as? AssetThingsListViewController
    {
        destination.bundlesRepository = bundlesRepository!
        destination.asset = assets[assetIds[assetIndex!]]
    }

    println("prepare for segue - end")
}
Run Code Online (Sandbox Code Playgroud)

编辑#3我在BitBucket上提供了一个示例项目

pte*_*fil 15

我检查了你的项目.虽然我也找不到任何其他东西,但我也怀疑它是线程问题.

我设法通过实现代理tableview并在代码中呈现新控制器来解决问题:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let destination = storyboard?.instantiateViewControllerWithIdentifier("BuilderToysListViewController") as! BuilderToysListViewController
    destination.botsRepository = botsRepository!
    destination.builder = builders[builderIds[indexPath.row]]

    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.presentViewController(destination, animated: true) { () -> Void in

        }
    })

}
Run Code Online (Sandbox Code Playgroud)

请注意,您已设置视图控制器故事板ID:BuilderToysListViewController并设置tableview委托.不要忘记删除segues.

最后在新视图控制器中解散视图使用此代码:

@IBAction func backButton(sender: AnyObject)
{
    dismissViewControllerAnimated(true, completion: { () -> Void in

    })
//        performSegueWithIdentifier("segueToysByBuilder", sender: nil)        

}
Run Code Online (Sandbox Code Playgroud)

这将允许您正确关闭视图,而不是错误地创建一个新视图.