在Objective-C / Cocoa中,Java的Thread.sleep()等效于什么?


112

在Java中,您可以使用暂停当前线程的执行一段时间Thread.sleep()。在Objective-C中有类似的东西吗?

Answers:


160

是的,有+ [NSThread sleepForTimeInterval:]

(因此,对于将来的问题,您知道,Objective-C是语言本身;对象库(至少是其中一个)是Cocoa。)


6
谢谢!<br>供以后参考,定义实际上是+ [NSThread sleepForTimeInterval:](因此,用法类似于[NSThread sleepForTimeInterval:0.1])。
TinkerTank 2010年

太棒了。谢谢!我刚刚完成了动画块,它就像一个魅力。
RileyE 2012年

睡在therad上怎么样?
jerinho.com 2012年

1
一样的; 主线程只是一个线程。不过,在主线程上休眠通常不是一个好主意,因为它会使您的程序无响应。
smorgan

4
对于那些想知道的人,[NSThread sleepForTimeInteval:]与[[NSThread currentThread] sleepForTimeInterval:]相同。
pnizzle 2014年

94

在Java中睡眠一秒钟

Thread.sleep(1000);

在目标C中睡一秒钟

[NSThread sleepForTimeInterval:1.0f];

40

你怎么睡觉了 睡眠时,您将阻止UI,并且所有后台URL都将不在其他线程中加载(使用NSURL异步方法仍可在当前线程上运行)。

您真正想要的是performSelector:withObject:AfterDelay。那是NSObject上的一种方法,您可以使用它在以后的某个预定时间间隔内调用该方法-它安排了将在以后执行的调用,但是线程处理的所有其他内容(如UI和数据加载)将仍在继续。


43
睡眠对我来说对测试很有用。我可以模拟一些网络延迟,以确保我的应用正确响应。目前,我正在针对本地Web服务器进行测试,因此所有内容基本上都是瞬时的。
brantonb

6
睡眠是测试网络延迟的错误方法。查看此问题的答案stackoverflow.com/questions/1502060/…以了解如何在模拟器中测试网络的可变速度。因为休眠主线程会阻塞所有内容,所以您根本没有在模拟网络延迟,而是更多地暂停了该应用程序。
Kendall Helmstetter Gelner 2010年

休眠对于模拟在JAVA线程上的联接操作上完成的操作很有用。您睡眠了10毫秒,检查线程是否已死,然后可以取消分配它。
Mike S

1
如果您睡眠了一段时间,则您的线程将与睡眠前的状态完全相同。这不是一个很好的测试,因为在现实世界中,您的应用程序将在处理而不是休眠。因此,重要的是弄清楚如何不依赖睡眠进行测试。
肯德尔·赫尔姆斯特·盖尔纳

+1感谢您指出替代解决方案!我一直在寻找:)
jpswain 2011年

7

当然,您也可以使用标准的Unix sleep()和usleep()调用。(但是,如果要编写可可,我将继续使用[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];
    }
}

0

usleep()也可以用作ive,有时可以暂停当前线程

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.