【问题标题】:Running activity indicator NOW现在跑步活动指示器
【发布时间】:2010-10-18 18:35:27
【问题描述】:

我想在进行磁盘 I/O 之前启动一个活动指示器。

如何立即启动指示器,而不是等待下一个显示循环周期?或者如何在开始磁盘 I/O 之前强制显示循环?

【问题讨论】:

    标签: iphone cocoa-touch ipad uikit ios


    【解决方案1】:

    如果我理解正确,您的 IO 操作需要一些时间,并且您希望 UI 在执行时更新,对吗?如果是这种情况,您必须将操作移动到后台线程,以便 UI 有机会自行更新,没有解决方法。使用 performSelectorInBackground:withObject: 调用您的 IO 操作,使用 NSOperation,如果您的目标是 iOS 4.0+,则使用块

    【讨论】:

    • 这些都是好主意。让我更全面地解释一下。通常,当我有一个复杂的视图要显示时,我会启动注意力指示器,然后使用 performSelector 延迟添加Subview 或 setNeedsDisplay。但是在这种情况下,我需要读取一个 XML 文件并构建一个大型数据结构以显示视图。所以我不能在后台运行。
    • 所以读取 XML 文件并在后台线程中构建您的大型数据结构,而进度指示器在主线程中旋转。
    • 谢谢丹尼尔。但这并没有改变任何东西。我无法在后台运行,因为在构建结构之前无法显示新视图。我错过了什么?
    • 抱歉浪费了您的时间。 performSelector 确实有效。我有一个编码错误。 - 丹
    【解决方案2】:

    据我所知,您不能强制指标现在开始。要推送一个方法调用,使其成为 runloop 中的下一件事,您可以使用:

    [self performSelector:@selector(taskToDo) withObject:nil afterDelay:0]
    

    这会将“taskToDo”(可以选择使用单个参数)调度到当前运行循环中,以便尽快发生。然后让那段代码退出。一种等效的方法是安排一个 NSTimer,但从语法上讲,这有点冗长。

    【讨论】:

    • 谢谢。我尝试了 performSelector 但它没有改变任何东西。
    • performSelector:withObject: 在这个意义上与直接调用完全一样。 performSelector:withObject:afterDelay: 为以后安排一些事情。你试过后者吗?
    • 嗨,汤米,是的,我有。请参阅我对 Mo 的回复。
    • 抱歉浪费了您的时间。 performSelector 确实有效。我有一个编码错误。 - 丹
    • 它对我有用,但只有 0.1 的延迟(0 在 iOS 4.0.1 上不起作用)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2011-06-28
    • 2012-06-08
    相关资源
    最近更新 更多