繁体   English   中英

应用程序中长时间运行的任务:didFinishLaunchesWithOptions:

Long-running task in application:didFinishLaunchesWithOptions:

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我的应用程序中有一些长时间运行的启动任务(比如从本地数据存储中加载Parse对象)。 应在界面开始出现之前完成这些任务。 该应用程序最初是使用故事板创建的,因此界面在application:didFinishLaunchesWithOptions:之后开始自动出现application:didFinishLaunchesWithOptions:方法完成。 我无法阻止主线程,因为Parse SDK在主线程上触发所有它的回调(因此阻塞会导致死锁)。 我还需要延迟从应用程序返回:didFinishLaunchesWithOptions:来完成设置。 所以我做的是:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Dispatch long-running tasks
    dispatch_group_t startup_group = dispatch_group_create();
    dispatch_group_async(startup_group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // Perform some long-running setup here
    });
    // Run main run loop until startup tasks finished (is it OK to do so?)
    while (dispatch_group_wait(startup_group, DISPATCH_TIME_NOW))
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
    return YES;
}

它是NSRunLoop的正确用法吗? 有什么潜在的警告吗? 你能提出更优雅(最好是GCD)的解决方案吗?

更新:

  1. 本地数据存储加载Parse对象(即从SSD加载微小文件)的操作并不像从Web加载某些东西那么长 延迟几乎没有引起注意,但足以触发warnBlockingOperationOnMainThread ,因此UX不是问题。
  2. 真正的问题是(偶发)崩溃是由于在常规主runloop之上旋转另一个主runloop引起的,这有时会导致重新进入UIApplication委托方法,这显然不是线程安全的。
  3. 因为引入闪屏是一个明显的解决方案,但我正在寻找一种更简单和优雅的东西。 觉得它存在。
4 个回复

虽然这在技术上取决于您的设置正在进行的操作(例如Web服务调用),但应用程序可能永远不会启动或启动时出现意外结果。

用户友好的方法是在您的故事板中添加“加载”视图控制器,这将是您的着陆视图。 在此处执行长时间运行设置,同时向用户提供信息/状态/任何适当的设置,然后推送原始视图控制器。

Imho我认为最好在你的主View Controller中做你的东西并向用户展示像自定义微调器这样的东西: 通过这种方式你可以下载你的数据并且用户知道会发生什么

花这么长时间推出一个空白屏幕的应用程序,或者只是一个没有用户信息的启动屏幕,这绝不是一个好主意。

滞后于didFinishLaunchingWithOptions:的回归didFinishLaunchingWithOptions:这真是一个坏主意。这会给你的应用程序带来不好的印象,也会给它带来糟糕的设计。

相反,您可以登陆视图控制器并显示一个叠加视图 ,显示您在完成时所执行的进度活动 ,您可以将其解雇 。这是正确的方法。

这是第三方库的链接 ,可以轻松显示/隐藏覆盖视图并在视图上设置一些文本。

你可以找到这么多像这样的库只是google iOS HUD .HUD意味着Heads Up Display或你可以轻松地使用UIAnimation自己设计自定义的东西。

一般来说,

我必须理解你编写的代码,你已经使用WhileNSRunloop停止了当前的流程或运行循环。

可能是你可以稍微改变你的代码并在程序的其他地方使用来停止当前流程或runloop并等待某事。

NSDate *runloopUntill = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (YourBoolFlag && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode runloopUntill])

以下Apple文档将为您提供NSRunloop 1 2的深入见解

这很有创意但是一个非常糟糕的主意。 您应该将UI加载到故障安全状态 - 换句话说,假设网络不可用/慢,并显示一个视图,如果它在渲染之前没有获取数据,则不会爆炸。 然后,您可以安全地在后台队列上加载数据,并在加载完成后更新视图或转换为以数据为中心的视图。

 dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{
        //Load your data here

        //Dispatch back to the main queue once your data is loaded.
        dispatch_async(dispatch_get_main_queue(), ^{
            //Update your UI here, or transition to the data centric view controller. The data loaded above is available at the time this block runs
        });
    });
1 Documentum应用程序中长时间运行的查询

在Documentum应用程序中检索对象时,需要花费很长时间。 我们已经在数据源och中激活了长期运行的查询选项,但是发现以下查询花费了太多时间: 如您所见,表“ a”是一个策略表,它只有7条记录。 在两个“或”运算符之后的SQL语句中,我们正在表“ a”中100个对象之间寻找一个o ...

2 Web应用程序中长时间运行的操作

Web应用程序操作通常旨在快速避免对用户的长时间等待。 但是,Web应用程序可能执行的某些操作可能会占用大量计算资源,并且需要花费大量时间。 REST处理此类操作可能需要几分钟,但需要立即响应用户的最佳实践是什么? Web应用程序可以花几分钟的时间返回HTTP请求的响应,还是返回202响应 ...

4 zshrc中长时间运行的任务

tldr 我想在zshrc中运行导出命令,该命令需要一段时间才能运行。 我不需要立即env变量,但想立即使用我的命令提示符。 有没有办法在后台启动此命令? 背景 我正在通过boot2docker在osx上使用docker。 我希望能够使用一个env变量(DOCKER_HO ...

5 在ThreadPool中长时间运行的任务

我目前正在开发MMORPG游戏,并具有一个FixedThreadPool,其中包含4-8(取决于硬件)可运行对象,这些对象可处理游戏中的运动。 这是Runnable的运行方法。 只要服务器正在运行,这些可运行文件就将运行。 现在,我在许多地方都读到,仅当任务不超过几秒钟时才应使用 ...

6 管理Web应用程序中长时间运行流程的策略?

我正在开发一个web asp.net应用程序。 应用程序的一个特性是用户能够排队一些长时间运行的操作,然后命中运行队列将被处理。 我不希望用户必须等待所有操作完成或确实打开浏览器/应用程序。 但是,如果它们保留或返回到页面,我希望他们能够看到每个作业的状态,即等待,进行中,完成或失败。 ...

7 如何处理ASP.NET Web应用程序中长时间运行的查询

我已经使用ASP.Net创建了一个Web应用程序,并将其托管在IIS上。 在此应用程序中,有些表单具有运行日志的查询,这些查询需要30秒钟以上的时间才能运行,而当我运行它们的任何查询时,所有其他表单有时会变慢,有时表明计算机已被挂起。 ...

2017-07-22 10:51:26 0 71   asp.net
10 如何确保在WPF应用程序中长时间运行的过程中更新了UI?

在遵循MVVM模式的WPF应用程序中,我遇到了一个常见问题,即用户单击在ViewModel中触发事件的按钮。 此事件应启用“请稍候”微调器动画,执行可能需要几秒钟的某些处理,然后隐藏微调器。 我不太确定可以使用微调器动画始终出现的良好模式。 例如,我有一个执行以下操作的登录过程: ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM