【问题标题】:Calculating string sizes on iPhone on a background thread在后台线程上计算 iPhone 上的字符串大小
【发布时间】:2010-03-22 03:01:04
【问题描述】:

我的应用程序中发生了一些相当大的字符串大小计算(每个都需要接近 500 毫秒,并且当用户滚动到我的应用程序(如天气应用程序)中的新“页面”时发生)。仅延迟每页发生一次,因为计算只需要运行一次(甚至可以缓存以供后续使用相同的数据启动)。

无论如何,我仍然喜欢不为这种类型的工作阻塞 UI,因为对我来说它使用线程尖叫,但我知道 UIKit 不打算在其他线程中使用。 (我知道 NSString 不是 UIKit 的一部分,但字符串大小调整方法是 UIKitAdditions 的一部分...)

那么我该怎么做呢?什么是不阻止 UI 并且安全地这样做的最佳方法?

【问题讨论】:

    标签: ios iphone cocoa nsstring uikit


    【解决方案1】:

    我总是在后台线程上使用-sizeWithFont 和朋友来计算单元高度等。它工作得很好。但是,从 iOS 6.0 开始,它会导致间歇性 crashes。希望这些问题能得到修复,因为这是在后台计算 UI 布局的基本性能优化。

    【讨论】:

    • 是的,该错误仍然在 Apple Bugreporter 中打开。
    • 并且仍然存在于 iOS 8 中——我只是在我的应用程序中偶然发现了它。它已经像这样运行(在后台线程上调用-sizeWithFont)多年了,但我只是恰到好处地安排了两个线程同时调用-sizeWithFont,然后应用程序崩溃了。
    【解决方案2】:

    考虑使用NSOperation/NSOperationQueue。 Cocoa Is My Girlfriend 上有tutorial,Apple 有guide

    【讨论】:

    • 这是建议的路线,而不是一般的线程,但没有解决在哪里做工作的问题,在主队列或其他队列上。如果我没记错的话,主队列是顺序的,因此与在主线程上运行具有相同的阻塞效果。
    • 我个人没用过,但至少根据文档,不一定会阻塞:“NSOperation类的isConcurrent方法告诉你一个操作是同步运行还是异步运行到调用它的 start 方法的线程。默认情况下,该方法返回 NO,这意味着操作在调用线程中同步运行。"
    • 对不起,我实际上是指我评论中的调度队列。有问题的问题是调用 sizeWithFont: 在主线程以外的任何东西上是否安全,使用操作队列或调度队列只是不必自己进行线程处理,而不是是否应该在主线程上的问题ui线程与否。
    • 我当然同意你关于使用操作队列而不是线程的观点。自从我开始在 Mac 和 iPhone 代码中使用它们之后,我的生活变得轻松多了。
    【解决方案3】:

    我可能错了,但我认为禁止在其他线程中使用 UIKit 与 GUI 工作的一般方式(单线程)有关,通常仅适用于 GUI 本身受到影响的情况。

    sizeWithFont: 方法实际上并不会影响 GUI,所以我认为在另一个线程中调用它不会有问题。

    也许对这种方法在幕后工作有更多经验的 iPhone 人可以证实我的想法或让我直截了当。

    【讨论】:

    • 也可能是某些调用不能很好地处理多线程调用......也就是说,我会从一个操作中尝试它,看看发生了什么,试图以任何可能的方式触发失败通过通过在您使用 UI 时反复循环计算来进行测试。
    • +1 对肯德尔的评论。由于 UIKit 方法是在考虑单线程的情况下编写的,因此它们可能无法很好地处理多线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多