在Objective-C / Cocoa中Java的Thread.sleep()相当于什么?
在Java中,您可以使用Thread.sleep()将当前线程的执行暂停一段时间。 Objective C中有这样的东西吗?
是的,有+ [NSThread sleepForTimeInterval:]
(只要你知道将来的问题,Objective C就是语言本身;对象库(至less其中之一)是Cocoa。)
在Java中睡一秒钟 :
Thread.sleep(1000);
目标C睡一秒钟 :
[NSThread sleepForTimeInterval:1.0f];
你为什么睡觉? 当你睡觉的时候,你正在阻塞UI,并且任何后台URL都不会加载到其他线程中(使用NSURLasynchronous方法仍然在当前线程上运行)。
机会是你真正想要的是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()也可以被用来作为一个使用它来暂停当前线程的时间