在objective-c中,睡眠发生在它之前的代码之前

Posted

技术标签:

【中文标题】在objective-c中,睡眠发生在它之前的代码之前【英文标题】:in objective-c, sleep happens before code prior to it 【发布时间】: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 你想通过暂停主线程随机数秒来达到什么目的? 【参考方案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)。

【讨论】:

以上是关于在objective-c中,睡眠发生在它之前的代码之前的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript在继续之前睡眠/等待[重复]

Objective-c:从方法返回自动释放的对象

睡眠并检查直到条件为真

spring DispatcherServlet,在它之前执行的代码

javascript / node.js中的睡眠功能[重复]

如何在 iOS 中以编程方式禁用/启用睡眠模式?