【问题标题】:How to speed up my app for the iPad?如何为 iPad 加速我的应用程序?
【发布时间】:2010-06-25 04:08:28
【问题描述】:
应用特定信息: com.oneorangetree.iphoneexample 未能及时启动 经过的总 CPU 时间(秒):3.500(用户 1.680,系统 1.820),17% CPU 已用应用程序 CPU 时间(秒):0.920,5% CPU

当应用加载时,它会在 viewDidLoad 中做很多事情 大约需要 30 秒才能完成。如何将它放在后台线程或其他东西中以加快应用程序并防止崩溃(因为加载时间过长)

【问题讨论】:

    标签: optimization iphone-sdk-3.0 ipad uikit viewdidload


    【解决方案1】:

    我过去曾使用NSOperation/NSOperationQueue 进行简单的线程化。具体来说,NSInvocationOperation 使旋转需要一段时间的方法调用变得非常容易,NSOperationQueue 实际上为您处理了它。您生成的方法必须是线程安全的,但这并不是特别难做到。例如,您可以在-init-viewDidLoad 方法中创建NSOperationQueue,然后将NSInvocationOperation 添加到队列中并按原样发送。

    NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
    NSInvocationOperation *lengthyTask = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(processAddresses) object:nil];
    [opQueue addOperation:lengthyTask];
    [lengthyTask release];
    

    其中一件很酷的事情(尤其是在桌面上)是在 10.6(和 iOS 4)上自动使用 Grand Central Dispatch。

    虽然线程化一个冗长的任务应该使您的应用程序响应更快(特别是如果您观察结果并在它们从线程化任务进入时显示它们,可能使用 KVO),但实现一些缓存将是有益的。每次发布都重新加载通讯录会非常昂贵,尤其是大多数人不会经常更改通讯录。您可以将计算的数据存储在本地文件或数据库中(Core Data 不太难使用,如果太慢可以直接使用 SQLite)。然后在启动时,您可以浏览地址簿,比较自上次运行应用以来每条记录的修改日期,对新修改的记录进行地理编码。

    【讨论】:

    • 谢谢。这确实大大加快了应用程序的加载速度,但是有没有办法通知用户我们仍在加载数据,这样他/她就不会认为应用程序冻结了?
    • 我假设每个操作都是按顺序完成的,因此您可以在返回每条记录时更新界面。这可以实现的两种方法是使用来自线程任务(有点像委托)的回调,该回调使用参数更新接口。另一种方法是在您的数据集合上实施KVC。让一个对象观察集合并在更新进入时对其进行处理。除非完全做到这一点,否则您可以尝试在屏幕上显示加载消息,有点像this
    【解决方案2】:

    是的,您可以使用后台线程,但是更好的方法是在可能的情况下预先计算(或缓存)事物,这样加载时间就不会那么长。 你的代码在做什么需要这么长时间才能运行?

    【讨论】:

    • 基本上我会在你的通讯录中访问谷歌地图和地理编码地址。如果你有大量的联系人,这需要很多时间。我有 300 多个应用程序崩溃,因为它需要很长时间。
    • 正如 paxswill 在下面使用 NSOperationQueue 所说的那样,您应该能够很好地完成这项工作而不会遇到太多麻烦。如果您创建一个 NSOperation 子类来处理单个地址簿条目的查找,然后为每个联系人创建实例, NSOperationQueue 将为您处理所有线程。作为额外的奖励,如果(当)一个具有多个核心 NSOperationQueue 的 iDevice 出现时,您无需对代码进行一次更改即可利用它:)
    猜你喜欢
    • 2013-02-18
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2013-05-28
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多