天道酬勤,学无止境

iOS app launch takes too long to display

Working on first app, have most of the programming done but app is taking too long at launch to display first tableview on tabbar. It takes 8-10 seconds on launch to display. Looking for help on tracking down what code is taking so long, etc. Here is the general app setup: tabbar with 5 tabs including navigation bars, mix of tableviews with detail views and scrollviews. The data for the tableviews is from multiple json feed from a remote web server. In the appdelegate.m I'm setting up the full tab/navigation bars. I get the json data feeds in each individual view controllers that setup on the tabbar. I've used the Profiler but don't know what I'm looking for and where. What is loaded on launch? Any advice on general setup of app that could be causing the delay? Does it load all views associated on the tabbar? Thanks in advance for any help.

评论

Run your program through instruments. Always. All the time. It will tell you most of the problems.

That said, you probably need to delegate your startup tasks to background threads, and update the UI as data comes available.

Use NSOperation, GCD, and related technologies for executing your background tasks.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • iOS:如何延迟启动屏幕?(iOS: how to delay the launch screen?)
    问题 启动应用程序时,一旦所有资产都初始化, LaunchScreen.xib 就会被删除。 我想让启动屏幕停留至少 1 秒。 有没有办法实现这一目标? 谢谢! 回答1 您可以创建一个使用 LaunchScreen 故事板的视图控制器,在applicationDidFinishLaunching或applicationWillFinishLaunching上呈现它(非动画),并在需要时关闭它。 请记住,Apple 不鼓励这样做,因为它给人的印象是您的应用程序需要更长的时间才能启动,这是糟糕的用户体验,并可能导致您的某些用户删除您的应用程序。 回答2 斯威夫特 4 更新 在appdelegate类的didfinishLauching....的方法中写一行代码Thread.sleep(forTimeInterval: 3.0)就可以了。 例子 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { Thread.sleep(forTimeInterval: 3.0) // Override point for customization after
  • 为什么连接回 iOS 后台 NSURLSession 需要等待锁定的时间过长,从而导致应用程序崩溃?(Why does connecting back to an iOS background NSURLSession take too long waiting on a lock, crashing the app?)
    问题 为什么通过其配置与 NSURLSession 连接需要很长时间,以至于它会在启动时使应用程序崩溃:“未能及时启动”? 我在许多 iOS 应用程序中看到过类似的崩溃转储,包括纽约时报 iOS 应用程序和 Evernote 应用程序。 [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:queue] 这是堆栈跟踪: Thread 0: 0 libsystem_kernel.dylib 0x3afb7aa0 semaphore_wait_trap + 8 1 libdispatch.dylib 0x3af04d3d _dispatch_semaphore_wait_slow + 173 2 CFNetwork 0x2febd8e3 -[__NSCFBackgroundSessionBridge setupBackgroundSession] + 379 3 CFNetwork 0x2fef18a1 +[__NSCFSessionBridge bridgeForConfiguration:session:queue:] + 153 4 CFNetwork 0x2fef6497 -[__NSCFURLSession initWithConfiguration:delegate
  • Why does connecting back to an iOS background NSURLSession take too long waiting on a lock, crashing the app?
    Why would connecting with an NSURLSession through its configuration take so long that it would crash the app on start up: 'failed to launch in time'? I've seen similar crash dumps in many iOS apps including NY Times iOS app and Evernote app. [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:queue] Here's the stack trace: Thread 0: 0 libsystem_kernel.dylib 0x3afb7aa0 semaphore_wait_trap + 8 1 libdispatch.dylib 0x3af04d3d _dispatch_semaphore_wait_slow + 173 2 CFNetwork 0x2febd8e3 -[__NSCFBackgroundSessionBridge setupBackgroundSession] + 379 3 CFNetwork 0x2fef18a1 +
  • “Message reply took too long.” - Watch Connectivity Issues with Watch OS 3
    In my project, I use Watch Connectivity to send messages to and from the Watch and iPhone. I can send a message to the phone and receive an array of strings when launching the app, however when using actions I get the following error; Error Domain=WCErrorDomain Code=7012 "Message reply took too long." Here's how things are set up; First, the watch sends a message to the phone and then the phone sends an array of strings to display in a WKInterfaceTable. This sometimes works when loading the app. ( I fetch all NSManagedObjects called Items and use their title string properties to store in an
  • “消息回复时间太长了。” - Watch OS 3 的手表连接问题(“Message reply took too long.” - Watch Connectivity Issues with Watch OS 3)
    问题 在我的项目中,我使用Watch Connectivity与 Watch 和 iPhone 之间发送消息。 我可以在启动应用程序时向手机发送消息并接收字符串数组,但是在使用操作时出现以下错误; 错误域=WCErrorDomain 代码=7012 “消息回复时间太长。” 这是设置的方式; 首先,手表向手机发送一条消息,然后手机发送一组字符串以显示在WKInterfaceTable 。 这有时在加载应用程序时有效。 (我获取所有名为Items NSManagedObjects 并使用它们的title字符串属性存储在名为watchItems的array 。 但是,我在手表上有一个操作来删除数组中的所有项目并用新数据刷新表。 手表上的动作使用sendMessage函数将item发送到手机从数组中删除,然后手机将新更新的数组发送给手表,手表更新表。 但是,我要么返回相同的数组,要么返回错误。 非常简单,所以在 Swift 3 和 Watch OS3/iOS 10 之前,一切实际上都运行良好; 整个应用程序曾经可以工作。 这是我如何设置一切; 电话应用程序委托 import WatchConnectivity class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate { var session
  • 探索 App 秒开的秘密 —— 启动性能优化
    提高程序的启动速度意义重大,很显然,启动时间越短,用户才越有耐心等待打开这个 App 进行使用,反之启动时间越长,用户则越有可能来不及等到 App 打开就已经切换到其他 App 了。 程序启动过程中的那些复杂错误的操作很可能导致严重的性能问题。Android 系统会根据用户的操作行为调整程序的显示策略,用来提高程序的显示性能。 例如,一旦用户点击桌面图标,Android 系统会立即显示一个启动窗口,这个窗口会一直保持显示直到画面中的元素成功加载并绘制完第一帧。 这种行为常见于程序的冷启动,或者程序的热启动场景(程序从后台被唤起或者从其他 App 界面切换回来)。 那么关键的问题是,用户很可能会因为从启动窗口到显示画面的过程耗时过长而感到厌烦,从而导致用户没有来得及等程序启动完毕就切换到其他 App 了。更严重的是,如果启动时间过长,可能导致程序出现 ANR。我们应该避免出现这两种糟糕的情况。 启动方式 Android 应用的启动方式分为三种:冷启动、暖启动、热启动,不同的启动方式决定了应用 UI 对用户可见所需要花费的时间长短。 顾名思义,冷启动消耗的时间最长。基于冷启动方式的优化工作也是最考验产品用户体验的地方。谈及优化之前,下面我们来看看这三种启动方式的应用场景,以及启动过程中系统都做了些什么工作。 冷启动 在安卓系统中,系统为每个运行的应用至少分配一个进程
  • 为什么 iOS 需要启动图像? [复制](Why does iOS require launch image? [duplicate])
    问题 这个问题在这里已经有了答案: 在 iOS 应用程序中启动图像的目的是什么? (2 个回答) 8 年前关闭。 iOS 应用程序必须使用启动图像吗? 应用程序启动时会显示多长时间,我们可以控制时长吗? 回答1 iOS 文档指出启动图像是 App Store 提交的要求,但是我目前有一个可用的应用程序没有一个(只是忘记添加它)所以看起来他们对执行或执行不太严格文档(至少我读过)不正确 启动应用程序时会显示图像本身。 您可以通过设置它来控制持续时间,以便您的应用程序启动得更快(或更慢,尽管我不知道您为什么要这样做)。 这是必需的,以便操作系统在应用程序初始化时显示一些内容(因为系统无法截图应​​用程序并在应用程序之间切换时使用它) 回答2 从第 204 页开始,Apple 的 iOS 人机界面指南文档, 为了增强用户在应用启动时的体验,您必须至少提供一张启动图片。 启动图像看起来与您的应用程序显示的第一个屏幕非常相似。 当用户启动您的应用程序时,iOS 会立即显示此图像,直到应用程序完全可以使用为止。 一旦您的应用准备好使用,您的应用就会显示其第一个屏幕,替换启动占位符图像。 您无法控制持续时间,但是,如果您设置启动图像(无论如何您都需要这样做)并创建一个特殊的根视图控制器来显示相同​​的图像,那么一旦删除启动图像,您的控制器就可见。 该控制器通常用于游戏
  • 启动图像和启动屏幕之间的区别(Difference between launch image and splash screen)
    问题 我正在查看iOS人机界面指南。 有人提到 显示与应用程序的第一个屏幕非常相似的启动图像。 这种做法减少了应用程序的启动时间。 避免显示“关于窗口”或初始屏幕。 通常,请尝试避免提供任何类型的启动体验,这些体验会阻止人们立即使用您的应用程序。 启动图像和启动屏幕之间有什么区别? 回答1 启动图像是启动应用程序时出现的图像,是您在xcode中放置的图像(iphone,iphone视网膜,ipad风景,ipad风景视网膜,ipad肖像和ipad肖像视网膜)Apple通过应用主窗口的屏幕截图推荐的图像,因此您的应用启动速度似乎更快(我使用的是不带按钮的屏幕截图) 例如,“小画面”屏幕是游戏使用的屏幕,您可以在其中看到公司徽标和其他一些信息,其中一些甚至使用2或3个小画面。 您必须以编程方式将其包括在内 回答2 哇,旧问题没有被接受或高度赞扬的答案,由于进行了编辑,它冒泡到了首页。 猜猜我也可以尝试清理一下吗? 启动图像(或启动屏幕) 这由OS本身显示,并且仅在OS加载您的应用程序时(即,在您的进程运行之前,您自己的任何代码都有机会执行)显示。 因为您的应用程序没有运行代码来处理启动图像的显示,所以提供代码的方式是Xcode项目的构建时配置的一部分:您可以提供LaunchScreen.storyboard ,还是提供一组静态启动图像-每个提供一个您支持的设备屏幕尺寸。 Apple的
  • Android APP启动以及性能优化
    一. 启动优化的目的 APP启动如果得到很好的优化,增强用户体验增加用户流量;如果app启动时间过长影响用户体验,从而会造成流失用户。所以做启动优化是有必须的。 二. 应用启动类型 1. 冷启动 概念:当应用在设备开机或者系统主动 kill APP 进程之后,用户点击桌面icon图标启动,称之为冷启动。场景:开机后第一次启动应用 或者 应用被杀死后再次启动生命周期:Process.start->Application创建->attachBaseContext->onCreate->onStart->onResume->Activity生命周期启动速度:在几种启动类型中最慢,也是我们优化启动速度最大的拦路虎 2. 温启动 概念:温启动是APP进程还存活,因为内存不足Activity被回收了,当再次启动APP时就会重新执行Activity生命周期,布局绘制等操作。场景:应用已经启动,返回键退出生命周期:onCreate->onStart->onResume->Activity生命周期启动速度:较快 3. 热启动 概念:当后台存在该应用的进程或者服务时,用户点击icon图标启动,称之为热启动。一般是用户按了home键回到桌面,或者返回键没有杀进程,或者app本身做了进程重启的机制。场景:Home键最小化应用生命周期:onResume->Activity生命周期启动速度:快
  • 衡量Android应用的启动时间(Measure Android app startup time)
    问题 衡量Android应用启动时间的最精确方法是什么? 通过启动时间,我的意思是2和3之间的差异: 应用程序进程未运行用户单击启动器中的应用程序图标主活动已完全初始化 因此,从根本上来说,我需要以某种方式获取自JVM启动以来经过的时间并进行记录。 回答1 我知道我来不及回答,但是,这正好回答了这个问题。 对于API版本19或更高版本,默认情况下,此信息会记录在Logcat中。 从Android 4.4(API级别19)开始,logcat包含一条输出行,其中包含一个名为Displayed的值。 此值表示在启动过程和完成在屏幕上绘制相应活动之间经过的时间。 ActivityManager:显示的com.android.myexample / .StartupTiming:+ 3s534ms 关键是在正确的位置寻找它- 如果要从命令行或在终端中跟踪logcat输出,则查找经过时间很简单。 要在Android Studio中查找经过的时间,必须在logcat视图中禁用过滤器。 禁用过滤器是必要的,因为系统服务器(而不是应用程序本身)会提供此日志。 摘录来自文档。 回答2 我将您的问题解释为“我的应用启动时间是否足够快。 我如何检查自己是否已做完一切?” 启动时间很大程度上是错误的指标,因为它会随设备和ROM的不同而不同。 我猜您最可能对您的代码感兴趣,这是您的代码花费了很长时间才能执行
  • iOS:使用HKObserverQuery的后台更新completionHandler(iOS : Use of HKObserverQuery's background update completionHandler)
    问题 HKObserverQuery有以下方法支持在后台接收更新: - initWithSampleType:predicate:updateHandler: updateHandler有一个completionHandler ,其中包含以下文档: 这个块被传递给更新处理程序。 处理完传入数据后,您必须立即调用此块。 调用这个块告诉 HealthKit 你已经成功接收到后台数据。 如果您不调用此块,HealthKit 将继续尝试使用退避算法启动您的应用程序。 如果您的应用程序未能响应 3 次,HealthKit 会认为您的应用程序无法接收数据,并停止向您发送后台更新。 从查看其他帖子来看,围绕这个处理程序似乎有很多困惑。 以下是我对此的一些疑问: 什么时候应该调用处理程序? 如果调用太晚,HK 可能会认为该应用程序从未收到查询更新,导致您使用后台更新 3 次打击退避算法。 文档指出应该在处理其他查询后调用它。 根据运行这些查询需要多长时间,听起来您可能会危险地接近后台更新罢工。 为什么需要这个? 系统不应该知道应用程序已经启动并收到了后台更新吗? 在后台使用CoreBluetooth时,它只会在后台唤醒您的应用程序 10 秒钟。 无需调用任何处理程序或处理后台更新 3 次。 如果您点击后台更新 3 次并且 HK 停止发送更新是永久性的吗? HK 是否再次开始发送后台更新?
  • iOS : Use of HKObserverQuery's background update completionHandler
    HKObserverQuery has the following method that supports receiving updates in the background: - initWithSampleType:predicate:updateHandler: The updateHandler has a completionHandler which has the following documentation: This block is passed to the update handler. You must call this block as soon as you are done processing the incoming data. Calling this block tells HealthKit that you have successfully received the background data. If you do not call this block, HealthKit continues to attempt to launch your app using a backoff algorithm. If your app fails to respond three times, HealthKit
  • 我在iPhone应用程序中收到错误0x8badf00d,不是通常的怀疑者(I get error 0x8badf00d in iPhone app, and is not the usual suspect)
    问题 我的应用在启动时发生随机崩溃。 我很确定不是启动时间(如8badf00d是什么意思中所述),因为该应用程序启动很快。 最糟糕的是崩溃日志无法被模拟(我无法获取源代码行号)。 这是错误: Exception Type: 00000020 Exception Codes: 0x8badf00d Highlighted Thread: 0 Application Specific Information: Failed to launch Thread 0: 0 JhonSell 0x000c63d6 0x1000 + 807894 1 JhonSell 0x000c7ffe 0x1000 + 815102 2 JhonSell 0x000c9646 0x1000 + 820806 3 JhonSell 0x000ca50a 0x1000 + 824586 4 JhonSell 0x000b3b72 0x1000 + 732018 5 JhonSell 0x000b3e1e 0x1000 + 732702 6 JhonSell 0x000b3fd4 0x1000 + 733140 7 JhonSell 0x0000a312 0x1000 + 37650 8 JhonSell 0x0000aa7c 0x1000 + 39548 9 JhonSell 0x00006e7c 0x1000
  • 首次在Google Maps中启动Activity的速度很慢(First launch of Activity with Google Maps is very slow)
    问题 我想在我的一个活动中添加SupportMapFragment。 我将此片段直接添加到布局xml并将此布局设置为内容视图。 但是,首次启动活动时,它会花费太长时间(超过1秒)。 下次发射是可以的,需要花费几毫秒的时间。 我试过了: 删除任何初始化使用MapFragment而不是SupportMapFragment 以编程方式添加MapFragment 但没有任何帮助。 显示地图时没有任何问题或可疑的日志。 您有什么建议,它是什么引起的以及如何改进它? 编辑:我有一个ListView,当用户单击Item时,它会启动MapFragment的DetailActivity。 单击项目后,DetailActivity出现之前会有明显的延迟。 我称之为setContentView的唯一方法onCreate运行超过1秒钟。 并且,虽然活动处于onCreate方法中,但该活动没有可见的内容。 单击和显示内容之间的这种延迟不是非常用户友好。 谢谢 回答1 第一次加载需要这么长时间的原因是因为Play服务API必须加载,如日志行所示: I/Google Maps Android API﹕ Google Play services client version: 6587000 I/Google Maps Android API﹕ Google Play services package
  • _UIApplicationHandleEventFromQueueEvent中出现意外的nil窗口(unexpected nil window in _UIApplicationHandleEventFromQueueEvent)
    问题 我的一个旧应用程序无法在iOS8上使用。 启动应用程序并尝试在屏幕上的任意位置点击时,我会在控制台中收到以下消息: unexpected nil window in _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow: <UIWindow: 0x7fe4d3e52660; frame = (0 0; 320 568); opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7fe4d3e2c450>; layer = <UIWindowLayer: 0x7fe4d3e86a10>> 我使用的是旧样式MainWindow.xib。 在MainWindow.xib中是我的Window对象,还有一个UINavigationController,它也定义了它的第一个View Controller。 下图显示了连接到App Delegate的插座。 下面的屏幕截图中的白色“视图”是UIWindow。 右侧的视图是UINavigationController(隐藏的导航栏),其中定义了第一个ViewController。 如何解决此问题,而不用新项目从头开始重新创建整个应用程序? 编辑:我刚刚发现有一个丁字裤
  • 如何在 Titanium 中实时查看?(how to live view in Titanium?)
    问题 我的团队在过去几个月一直在开发 Titanium,现在我们面临一个问题:当我们对 View 代码进行更改(更改其字体、背景或大小)时,需要很长时间(大约 1 分钟)直到我们看到设备上显示的结果。 这真是浪费时间。 我已经看到了 TiShadow,它很棒,但它只支持 js 代码(如Alloy.createTableList... ),不支持 Alloy XML(我的意思是一旦更改 . xml 或 .tss 文件) 我也查了'forgedUI',可惜它只是一个UI设计工具,坏消息是它的官网被关闭了。 为了减少编译时间,我为我的团队购买了 SSD 磁盘。 编译时间确实从 60s 减少到 40s。 但还是太长了。 有什么好的工具可以让我们更快地调试钛吗? 或者如何减少 Titanium 的编译时间? 回答1 我能够找到以下可用于 Titanium 的工具,以减少在设备/模拟器中测试应用程序所需的时间。 TiShadow :最广泛使用和开源。 Rapiddev : 目前仅适用于 ios,但正在快速开发中。 LiveView:适用于企业版 Titanium。 PS:使用 TiShadow,我能够测试在 tss/views 和控制器中所做的更改。 监视终端(从触发 tishadow 命令的地方)以查看重新编译代码的进度。 回答2 2019-04-11 更新:不要使用钛,使用 React
  • iOS应用程序初始屏幕使用什么尺寸?(What are the sizes used for the iOS application splash screen?)
    问题 我正在使用iOS SDK开发应用程序。 我需要知道我需要什么Default初始屏幕尺寸。 回答1 2018更新-请不要使用此信息! 我将以下帖子留作参考。 请阅读Apple的文档《人机界面指南-启动屏幕》,以获取有关启动屏幕和建议的详细信息。 谢谢德雷卡 2012年7月-由于此回复较旧,但仍然很受欢迎。 我写了一篇基于Apple doco的博客文章,并将其放在我的博客上。 我希望你们觉得它有用。 是的。 在iPhone / iPad开发中,设备会自动显示Default.png文件,因此您无需对其进行编程,这真的很有用。 我没有,但您需要使用特定名称的iPad使用不同的PNG。 我在iPad default png进行了搜索,并从phunkwerks网站获得了以下信息: iPad启动图像方向 为了处理各种方向选项,已经为iPad启动图像创建了新的命名约定。 iPad的屏幕尺寸为768×1024,请注意,高度旁边的尺寸考虑了20像素状态栏。 文件名尺寸 Default-Portrait.png * — 768w x 1024h Default-PortraitUpsideDown.png — 768w x 1024h Default-Landscape.png **-1024w x 748h Default-LandscapeLeft.png — 1024w x 748h
  • 如何在 Swift Xcode iOS 中以编程方式延迟启动屏幕(How can I delay splash launch screen programmatically in Swift Xcode iOS)
    问题 我已经把一个image中imageView在LaunchStoreyboard 。 如何以编程方式延迟图像的时间? 这是Apple的启动屏幕指南。 这是启动屏幕视图控制器的代码: import UIKit class LaunshViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.delay(0.4) } func delay(_ delay:Double, closure:@escaping ()->()) { let when = DispatchTime.now() + delay DispatchQueue.main.asyncAfter(deadline: when, execute: closure) } } 回答1 在 AppDelegate 类中放入一行代码 - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { Thread.sleep(forTimeInterval: 3.0) // Override
  • iOS中的Firebase Analytics事件未显示(Firebase Analytics events from iOS not showing up)
    问题 我正在测试由Google提供支持的新型Firebase,并已实现了远程通知和崩溃报告。 但是,在使Analytics(分析)正常工作方面,我遇到了很多问题。 我跟踪与事件FIRAnalytics.logEventWithName(...)并保存用户pproperties FIRAnalytics.setUserPropertyString(...) 但是,无论我做什么,Firebase Analytics Console中都不会显示任何数据。 好吧,我确实收到了一些事件,但是这些事件不是我发送的(例如first_open和session_start )。 同样,此数据似乎在很长一段时间后也会下降。 此外,当我跟踪事件并保存用户数据时,会收到以下信息: Upload task scheduled to be executed in approx. (s): 3102.294599890709 这似乎真的很奇怪-Firebase等待近一个小时才能尝试发送下一批数据,这一定是bug,还是可以配置的? 当我等待极长的延迟时,数据已发送...但未显示。 回答1 Firebase事件会一起批处理并每小时上传一次,以防止设备上的电池消耗过多。 在iOS上,当您在1h上传目标之前将应用程序设为后台时,事件将在后台此时分派。 您可以启用iOS的调试日志记录(https://firebase
  • 使用asynctask加快android应用启动时间(using asynctask to speed up android app launch time)
    问题 我有一个应用程序可以从两个网络加载广告,并在启动时将Flash文件设置为webview。论坛告诉我使用asynctask,这会使启动速度太慢,有人可以将此代码设为asynctask。 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); airpush=new Airpush(getApplicationContext()); airpush.startPushNotification(false); airpush.startIconAd(); airpush.startDialogAd(); airpush.startAppWall(); mWebView = (WebView) findViewById(R.id.webview); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.getSettings().setPluginsEnabled(true); mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); mWebView