【发布时间】:2010-10-24 04:29:58
【问题描述】:
在 Java 中,您可以使用 Thread.sleep() 暂停当前线程的执行一段时间。 Objective-C 中有这样的东西吗?
【问题讨论】:
标签: ios objective-c cocoa-touch sleep
在 Java 中,您可以使用 Thread.sleep() 暂停当前线程的执行一段时间。 Objective-C 中有这样的东西吗?
【问题讨论】:
标签: ios objective-c cocoa-touch sleep
是的,有+[NSThread sleepForTimeInterval:]
(只是为了让您知道未来的问题,Objective-C 是语言本身;对象库(至少其中一个)是 Cocoa。)
【讨论】:
在 Java 中睡眠 一秒:
Thread.sleep(1000);
在目标 C 中睡眠 一秒:
[NSThread sleepForTimeInterval:1.0f];
【讨论】:
你为什么要睡觉?当你睡觉时,你会阻塞 UI 以及任何不在其他线程中的后台 URL 加载(使用 NSURL 异步方法仍然在当前线程上运行)。
您真正想要的是 performSelector:withObject:AfterDelay。这是 NSObject 上的一个方法,您可以使用它稍后在某个预定时间间隔调用一个方法 - 它安排将在稍后执行的调用,但线程处理的所有其他内容(如 UI 和数据加载)将继续。
【讨论】:
当然,您也可以使用标准的 Unix sleep() 和 usleep() 调用。 (但是,如果编写 Cocoa,我会使用 [NSThread sleepForTimeInterval:]。)
【讨论】:
如果使用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];
}
}
【讨论】:
usleep() 也可以用作我用来暂停当前线程的时间
【讨论】: