在 Java 中,您可以使用Thread.sleep()
. Objective-C中有这样的东西吗?
6 回答
是的,有+[NSThread sleepForTimeInterval:]
(只是为了让你知道未来的问题,Objective-C 是语言本身;对象库(至少其中一个)是 Cocoa。)
在 Java 中休眠一秒钟:
Thread.sleep(1000);
在 Objective 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() 也可以用作我使用它来暂停当前线程的时候