【问题标题】:in objective-c, sleep happens before code prior to it在objective-c中,睡眠发生在它之前的代码之前
【发布时间】:2012-01-13 04:29:07
【问题描述】:

在这段代码中,睡眠似乎发生在按钮隐藏之前。这是为什么呢?

-(void)buttonPressed{
        NSLog(@"Button pressed!");
        button.hidden=true;
        sleep(rand()%10);
        NSLog(@"out of sleep!");
    }

【问题讨论】:

  • 这是什么环境——除了“objective-c”?最有可能是 OSX 还是 iOS?
  • 你想通过暂停主线程随机数秒来达到什么目的?

标签: objective-c


【解决方案1】:

'hidden' 的设置会立即发生并触发运行循环中的SetNeedsDisplay。然后该方法休眠。然后在睡眠后运行循环执行并更新显示。所以只是睡眠会阻止显示更新,直到睡眠结束。

【讨论】:

    【解决方案2】:

    我的猜测是 hidden 属性设置成功,但屏幕没有更新,因为你暂停了线程。

    屏幕更新将在稍后进行。

    【讨论】:

      【解决方案3】:

      在这一点上我没有任何具体的 Objective-C 知识 - 但 UI 是单线程的并且按钮状态的更新被放入队列以等待执行是常见的情况。然后调用 sleep 会暂停所有当前线程活动,因此会停止 UI 更新。

      【讨论】:

        【解决方案4】:

        SetNeedsDisplay 实质上设置了一个标志,该标志将导致控件在下一次围绕 UI 循环重新呈现。它不会立即生效,因为它通常会稍微延迟,以便合并各种 UI 刷新。

        在 UI 线程中执行 sleep() 调用确实令人不悦……如果您希望在隐藏按钮后几毫秒内执行某些操作,我建议您调用 performSelector:withObject:afterDelay:,根据此线程:

        How to use performSelector:withObject:afterDelay: with primitive types in Cocoa?

        一般来说,您希望尽可能少地阻塞 UI 线程,因为任何阻塞代码(例如睡眠)都会导致 UI 滞后、通常无响应或沙滩球 (SPoD)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-10
          • 2013-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-18
          • 1970-01-01
          相关资源
          最近更新 更多