ios - 在不延迟 UIViewController segue 的情况下运行 CPU 密集型代码?如何在 UIViewController 出现后*仅执行一次代码?

标签 ios swift uiviewcontroller uistoryboardsegue

点击 ViewController1 中的按钮会将应用程序转至 ViewController2。

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

副作用是糟糕的用户体验。 ViewController1 按钮突出显示的时间更长,并且 Segue 明显延迟。

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

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

另一种选择是将代码放在 ViewController2 的 viewDidLoad 中, 但会稍微延迟 dispatch_after ,确保代码不会影响转场。

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

是否还有另一个 UIViewController 函数应该用于此目的(即仅执行一次的代码,并且仅在 UIViewController 将自身呈现给用户之后)?

最佳答案

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

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

  2. 将长时间运行的作业插入操作队列,并让操作在完成后将委托(delegate)消息(或通知,无论您的船如何 float )发送回 View Controller 2。当 VC2 收到该消息时,它可以“刷新”。

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

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

关于ios - 在不延迟 UIViewController segue 的情况下运行 CPU 密集型代码?如何在 UIViewController 出现后*仅执行一次代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37150679/

相关文章:

ios - 将音频上传到 Firebase Swift

ios - 将数据从容器 View 传递到 MainViewController

ios - 在自定义 UITableViewCell 中单击按钮时重新加载 UITableView

swift 无法为索引为 'String' 的 [String : DataModelBase. Type] 类型的值添加下标

uiviewcontroller - 将 ViewController 添加到 Appdelegate

ios - 在 UITableView 中单击时更改 UIButton 颜色和文本

ios - 获取 Assets 中声明的颜色的浅色或深色变体

ios - Xcode 中的 Firebase 身份验证和实时数据库 : How do I only show data relevant to ONE user not all?

iphone - 以正确的方式从导航堆栈中删除 View Controller

iphone - 帧缓冲区对象问题