Objective-C/Cocoa 中 Java 的 Thread.sleep() 等价物是啥?
Posted
技术标签:
【中文标题】Objective-C/Cocoa 中 Java 的 Thread.sleep() 等价物是啥?【英文标题】:What's the equivalent of Java's Thread.sleep() in Objective-C/Cocoa?Objective-C/Cocoa 中 Java 的 Thread.sleep() 等价物是什么? 【发布时间】:2010-10-24 04:29:58 【问题描述】:在 Java 中,您可以使用 Thread.sleep()
暂停当前线程的执行一段时间。 Objective-C 中有这样的东西吗?
【问题讨论】:
【参考方案1】:是的,有+[NSThread sleepForTimeInterval:]
(只是为了让您知道未来的问题,Objective-C 是语言本身;对象库(至少其中一个)是 Cocoa。)
【讨论】:
Thnx! 供以后参考,定义其实是+[NSThread sleepForTimeInterval:](所以,像[NSThread sleepForTimeInterval:0.1]一样使用)。 这是完美的。谢谢!我刚刚完成了我的动画块,它就像一个魅力。 睡在main therad怎么样? 同理;主线程只是一个线程。不过,在主线程上休眠通常是个坏主意,因为它会使您的程序无响应。 对于那些想知道的人,[NSThread sleepForTimeInteval: ] 与 [[NSThread currentThread] sleepForTimeInterval: ] 相同。【参考方案2】:在 Java 中睡眠 一秒:
Thread.sleep(1000);
在目标 C 中睡眠 一秒:
[NSThread sleepForTimeInterval:1.0f];
【讨论】:
【参考方案3】:你为什么要睡觉?当你睡觉时,你会阻塞 UI 以及任何不在其他线程中的后台 URL 加载(使用 NSURL 异步方法仍然在当前线程上运行)。
您真正想要的是 performSelector:withObject:AfterDelay。这是 NSObject 上的一个方法,您可以使用它稍后在某个预定时间间隔调用一个方法 - 它安排将在稍后执行的调用,但线程处理的所有其他内容(如 UI 和数据加载)将继续。
【讨论】:
睡眠对我来说是有用的测试目的。我可以模拟一些网络延迟,以确保我的应用程序正确响应。目前我正在针对本地 Web 服务器进行测试,所以一切基本上都是即时的。 睡眠是测试网络延迟的错误方法。查看这个问题的答案***.com/questions/1502060/…,了解如何在模拟器中测试网络的可变速度。因为休眠主线程会阻塞所有内容,所以您根本不是在模拟网络延迟,而是更多的是应用程序的暂停。 睡眠对于模拟在 JAVA 线程上的连接操作上完成的操作很有用。你睡了 10 毫秒,检查线程是否死了,然后你可以释放它。 如果你睡了一段时间,你的线程将完全处于你睡前的状态。这不是一个好的测试,因为在现实世界中,您的应用程序将进行处理,而不是休眠。这就是为什么弄清楚如何在不依赖睡眠的情况下进行测试很重要。 +1 感谢您指出替代解决方案!正是我想要的:)【参考方案4】:当然,您也可以使用标准的 Unix sleep() 和 usleep() 调用。 (但是,如果编写 Cocoa,我会使用 [NSThread sleepForTimeInterval:]。)
【讨论】:
【参考方案5】:如果使用NSThread sleepForTimeInterval(注释代码)休眠,会阻塞取数据,但是+[NSThread sleepForTimeInterval:](checkLoad方法)不会阻塞取数据。
我的示例代码如下:
- (void)viewDidAppear:(BOOL)animated
//....
//show loader view
[HUD showUIBlockingIndicatorWithText:@"Fetching JSON data"];
// while (_loans == nil || _loans.count == 0)
//
// [NSThread sleepForTimeInterval:1.0f];
// [self reloadLoansFormApi];
// NSLog(@"sleep ");
//
[self performSelector:@selector(checkLoad) withObject:self afterDelay:1.0f];
-(void) checkLoad
[self reloadLoansFormApi];
if (_loans == nil || _loans.count == 0)
[self performSelector:@selector(checkLoad) withObject:self afterDelay:1.0f];
else
NSLog(@"size %d", _loans.count);
[self.tableView reloadData];
//hide the loader view
[HUD hideUIBlockingIndicator];
【讨论】:
【参考方案6】:usleep() 也可以用作我用来暂停当前线程的时间
【讨论】:
以上是关于Objective-C/Cocoa 中 Java 的 Thread.sleep() 等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在代码中使用核心数据 - Objective-C/Cocoa
如何在 Objective-C/Cocoa 中更改状态栏项目标题的颜色?
Objective-C/Cocoa/XCode 新手:如何接收通知?