【问题标题】:UIView takes too long to updateUIView 更新时间过长
【发布时间】:2011-07-08 22:24:56
【问题描述】:

在一个 iPad 应用程序中,我在一个更大的 UIView 中有一堆 UIImageViews。每个 UIImageView 都包含一个在单独的线程中生成的缩略图(以免冻结应用程序)。成功生成缩略图后,我在主线程上调用setNeedsDisplay,但是,当缩略图可用时它不会更新 UIImageViews(我可以在日志中看到它们),而是需要大约 5 秒然后显示所有一次。

这是在单独的线程中创建缩略图时我正在做的事情:

[self performSelectorOnMainThread:@selector(setNeedsDisplay) 
                       withObject:nil 
                    waitUntilDone:NO];

有什么想法吗?

【问题讨论】:

    标签: iphone ios4 iphone-sdk-3.0 uikit ios-simulator


    【解决方案1】:

    问题是你不能告诉可可它必须“现在”重绘。 使用setNeedsDisplay,您只能订购重绘,因为绘图是相当昂贵的过程。

    setNeedsDisplay

    您可以使用此方法或 setNeedsDisplayInRect: 通知 您的视图内容所需的系统 要重绘。这种方法使 请求和返回的注释 立即地。观点实际上并不 重绘直到下一个绘图周期, 此时所有无效的视图 已更新。

    Mybe 是等待所有生成的缩略图的更好、更高效的解决方案?!

    【讨论】:

    • 当我拖动 UIImageViews 时,它们不应该被重绘。我无法理解的是为什么他们需要很长时间才能开始显示缩略图。
    【解决方案2】:

    你的主线在做什么?如果您的应用程序在重绘之前等到所有缩略图都可用,那么听起来您可能无意中阻塞了主线程,直到您的缩略图队列清空。你是如何设置线程的?

    【讨论】:

    • 不,我的主线程允许用户与视图交互(拖动、排列等)。所以它不会停滞不前。这就是我使用单独的线程来加载缩略图的原因,这样 UI 看起来就不会生涩。我正在使用 NSOperationQueue 进行线程处理,我的日志显示线程大约需要 200 毫秒才能完成它们的工作。但缩略图仅在大约 5 秒后出现。
    • 我知道你说你在主线程上调用setNeedsDisplay,但你是在后台线程完全与 UIKit 交互吗?
    • 不,一点也不。我只是在读取源图像,调整它们的大小并将它们设置在 UIIImageView 上,哦等等,我不能在 UIImageView 上设置它们可以吗?哎呀。这是一个愚蠢的错误。我很尴尬。谢谢吉姆。问题已解决。
    • 不用担心。我之所以想到这一点,是因为我上周犯了完全相同的错误(写一个线程缩略图,很有趣)。
    【解决方案3】:

    我会使用 NSNotification。当图像准备好时,从加载图像的线程发送通知。您的视图控制器可以观察这些通知并在它们到达时更新视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多