【问题标题】:Run CPU-intensive code without delaying UIViewController segue? How to execute code *only once and after* the UIViewController has presented itself?在不延迟 UIViewController segue 的情况下运行 CPU 密集型代码?如何在 UIViewController 出现后*只执行一次代码?
【发布时间】:2016-09-06 03:34:31
【问题描述】:

点击 ViewController1 中的按钮会将应用程序连接到 ViewController2。

点击按钮也会触发稍微占用 CPU 的操作。 (即,合并多个图像并将结果写入磁盘)。在点击按钮之前无法启动此操作。

副作用是糟糕的用户体验。 ViewController1 按钮高亮显示的时间更长,segue 明显延迟。

将密集的代码移动到 ViewController2 的 viewDidLoad 函数似乎没有帮助,因为它会产生延迟,但在 ViewController2 方面不是 ViewController1。

将代码移动到 ViewController2 的 viewDidAppear 似乎也是不可取的,因为这个操作应该只触发一次,而不是每次 ViewController2 出现。添加一个变量来跟踪操作是否已触发似乎不是最理想的。

另一种选择是将代码放在 ViewController2 的 viewDidLoad 中,但会在 dispatch_after 中引入一点延迟,以确保代码不会破坏 segue。

处理这种模式的正确方法是什么?

是否有另一个 UIViewController 函数应该用于此目的(即代码只执行一次,并且只有在 UIViewController 向用户展示自己之后)?

【问题讨论】:

    标签: ios swift uiviewcontroller uistoryboardsegue


    【解决方案1】:

    在高层次上,这里有一个想法:

    1. 创建一个将“结果”作为属性的单例类。当视图控制器 2 请求它时,如果它不存在(如果它确实存在,那么你已经完成),单例可以创建它(结果)。

    2. 将长时间运行的作业推送到操作队列中,并让操作在完成后将委托消息(或通知,无论您的船是否漂浮)发送回视图控制器 2。当 VC2 收到该消息时,它可以“刷新”。

    3. 根据该工作需要多长时间,您可能希望在 VC2 上放入微调器和/或加载消息,然后在“刷新”期间将其删除。

    (我提到操作队列,主要是因为我喜欢它们。它可以是你喜欢的任何机制,重点是工作不是在主线程上完成的。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多