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:获取关键代码

Objective-C/Cocoa/XCode 新手:如何接收通知?

iOS 的objective-c/cocoa 中存在哪些方法族?

带有延迟 NSMenu 的 NSButton - Objective-C/Cocoa