【问题标题】:UI update in objective-cObjective-c 中的 UI 更新
【发布时间】:2014-07-23 04:29:02
【问题描述】:

我的疑问是关于 Objective-C 中的 UI 更新。例如让我们考虑这段代码

 myButton.hidden= YES;

文档说该按钮不会立即隐藏,但会在下一个运行循环中完成。实际隐藏需要多长时间。出于实际目的,它可以被认为是瞬时的吗? 我问这个问题是因为我需要在某个过程完成 70% 时隐藏一个按钮。

// on main thread

    if (completionPercentage == 70)
    {
     myButton.hidden= YES;
    // some other stuff
    }

但在进程完成 70% 后,按钮可能会在几毫秒内保持可见,如果在此期间点击它,应用就会崩溃。

编辑: 我正在更新两个进程和取消按钮的功能。

Process1 正在NSThread 上运行。 myButton 的作用是取消正在运行 Process1 的线程。当 Process1 完成 70% 时,我 dispatch_asyncon HIGH_PRIORITY_QUEUE另一个使用来自 Process1 的数据的进程。让我们称之为Process2。因此,一旦 Process2 启动,就无法取消 Process1。 所以在上面提到的Ifblock 中,我隐藏了myButtononce Process1 完成了 70%。但它并没有立即隐藏因此问题。希望我已经说清楚了。

【问题讨论】:

  • 你试过去 myButton.enabled = NO;或 myButton.userInteractionEnabled = NO;在隐藏之前?
  • @Zhang 我没有尝试过,但我怀疑 enabled 属性的行为也会相同。甚至它们会在下一个运行循环中生效。
  • 在 dispatch_async 块中试试这个。
  • 当你点击那个按钮时会执行什么?按钮点击方法是否取决于正在处理的某些数据?奇怪的是,点击一个没有连接任何东西的按钮会导致崩溃。也许您可以在执行预期代码之前检查您的按钮点击方法,completionPercentage >= 70?
  • 请附加崩溃日志。

标签: ios objective-c ios7 uikit grand-central-dispatch


【解决方案1】:
dispatch_async(dispatch_get_main_queue(), ^{
        [mButton setHidden:YES];
});

应该异步完成

【讨论】:

  • 但是 If 语句已经在 main_queue 上。它会帮助从 main_queue 内部调度主队列吗?我希望它只会延迟执行,因为它被作为一个单独的块放置。但是,延迟可以忽略不计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
相关资源
最近更新 更多