【问题标题】: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 中有这样的东西吗?

【问题讨论】:

    标签: ios objective-c cocoa-touch sleep


    【解决方案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 服务器进行测试,所以一切基本上都是即时的。
      • 睡眠是测试网络延迟的错误方法。查看这个问题的答案stackoverflow.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() 也可以用作我用来暂停当前线程的时间

          【讨论】:

            猜你喜欢
            • 2011-07-21
            • 1970-01-01
            • 2010-11-29
            • 1970-01-01
            • 1970-01-01
            • 2010-11-22
            • 2014-07-28
            • 2013-12-01
            • 2015-07-30
            相关资源
            最近更新 更多