在调用pushViewController之前预呈现视图控制器

时间:2016-03-03 08:13:09

标签: ios

我有AViewController并希望将BViewController推送到导航堆栈,但BViewController有很多用户界面,需要两秒钟才能呈现。

是否可以在推送之前预先渲染BViewController的UI,以便立即显示?

2 个答案:

答案 0 :(得分:1)

任何用户界面都不需要2秒钟才能推送,所以你确实遇到了问题。

您有不同的解决方案:

  1. 按下控制器而不加载数据,并在显示微调器的同时立即开始加载。例如,如果你有一个tableview,它将是空的,并且一个微调器将在屏幕中间旋转,带有一个小标签,上面写着" Loading ..."。完成后,您将填充tableview并显示它。
  2. 通过这种方式,您的用户可以知道发生了什么,如果他愿意,他可以决定回去,或者等待2秒钟。

    1. 如果在用户推送时加载数据确实是强制性的,您可以在推送控制器之前加载它。但这实际上取决于它是什么类型的数据。如果是元素的详细视图,则无法加载所有元素以防万一。如果它的视图始终相同,则可以在AViewController完成加载时加载它,这将为您提供加载所需的时间,因为用户可能会在推送{{{}之前停留一两秒1}}。可能不建议使用此方法。你可以大致这样做:

      BViewController
    2. 但是真的没有选择2,在很多情况下预加载UI很可能很糟糕。预加载数据很常见,但UI,我不这么认为。

      1. 您可以减少要加载的数据量。确保您的图像足够压缩(在小屏幕上,您不需要4K图像),确保在您真正需要单个对象时不要加载完整的数据库等。您应该只下载什么用户会看到,而不是'一切'。再说一遍,如果你做得恰到好处,它应该已经很好了。
      2. 我强烈建议您尝试选项3 强文,确保所有内容都很小并且正是您需要的。如果是,那么选择选项1

        不要忘记:用户知道他想要什么,你不知道。如果他不想等待两秒钟,他应该可以在它旋转的时候回去。他永远不应该被迫等待两秒钟,你的应用程序永远不应该挂起。

        编辑:你说你需要加载"很多UI"。你能告诉我们/确切地说UI需要两秒钟加载吗?我有非常复杂的观点(我的意思是非常复杂),UI从来没有花费那么长时间来加载。

答案 1 :(得分:0)

在后台线程中的bViewController中加载你的东西。

    - (void)viewDidLoad {
        [super viewDidLoad];

        dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
            //Background Thread
            // Do your loading stuff here

            dispatch_async(dispatch_get_main_queue(), ^(void){
                //Run your UI Updates
            });
        });
    }