我正在复制我在我的应用程序包中包含的数据库,并将其传输到Documents目录以使其可写。这需要一些时间,我现在只有一个闪屏。有没有办法放置“正在加载...”警报或某种活动指示器(就像加载游戏时单词与朋友一样),向用户提供一些关于前20秒发生的事情的背景信息他们第一次打开应用程序?我不知道我是否以某种方式引用了该屏幕,因为从AppDelegate呈现的第一个viewController尚未加载。感谢。
答案 0 :(得分:1)
在应用程序启动时执行长时间运行的任务时,需要考虑一些事项。
应用程序已完成启动
你必须在一定时间内完成- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
,我认为这是20秒,否则你的申请将被关闭监视器
我通常做的是创建一个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以显示更新的信息。