在应用初始化时传输数据时创建加载屏幕/“警报”

时间:2012-02-16 17:12:48

标签: iphone

我正在复制我在我的应用程序包中包含的数据库,并将其传输到Documents目录以使其可写。这需要一些时间,我现在只有一个闪屏。有没有办法放置“正在加载...”警报或某种活动指示器(就像加载游戏时单词与朋友一样),向用户提供一些关于前20秒发生的事情的背景信息他们第一次打开应用程序?我不知道我是否以某种方式引用了该屏幕,因为从AppDelegate呈现的第一个viewController尚未加载。感谢。

1 个答案:

答案 0 :(得分:1)

在应用程序启动时执行长时间运行的任务时,需要考虑一些事项。

应用程序已完成启动

你必须在一定时间内完成- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions,我认为这是20秒,否则你的申请将被关闭监视器

Note On WatchDog Crashes

我通常做的是创建一个LoaderViewController并将其添加为窗口的子视图。我仍然将应用程序的根视图控制器设置为第一个视图控制器。这实际上是将加载控制移交给加载器视图控制器以执行您的功能。

尽管苹果的人机界面指南不赞成这一点

  

避免显示“关于”窗口,启动画面或提供任何内容   其他类型的启动体验,阻止人们使用您的   立即申请。

iOS Human Interface Guidelines

非阻止

您还希望使用GrandCentral Dispatch在后台执行所有复制,或使用- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg来阻止阻止主线程。这样,您可以呈现在执行任务时仍保持旋转的UIActivityIndicatorView

Grand Central Dispatch

Grand Central Dispatch可能是解决此问题的最佳方式。你可以在后台执行你的任务并更新主线程,比如像这样的同一个块中的UIProgressView

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //Do something in background
        dispatch_async(dispatch_get_main_queue(), ^{
            //Update UI
        });
    });

完成后,删除您的LoaderViewController [loaderViewController removeFromSuperview];,您的应用程序将转到第一个控制器。此时,您还可以刷新UI以显示更新的信息。

Grand Central Dispatch Reference