Respostas:
Sim, há + [NSThread sleepForTimeInterval:]
(Para que você saiba para futuras perguntas, Objective-C é a linguagem em si; a biblioteca de objetos (pelo menos um deles) é Cacau.)
Dormindo por um segundo em Java:
Thread.sleep(1000);
Dormir por um segundo no Objetivo C:
[NSThread sleepForTimeInterval:1.0f];
Por que você está dormindo? Quando você dorme, está bloqueando a IU e também qualquer carregamento de URL de segundo plano que não esteja em outros encadeamentos (o uso dos métodos assíncronos NSURL ainda opera no encadeamento atual).
Provavelmente, o que você realmente deseja é performSelector: withObject: AfterDelay. Esse é um método em NSObject que você pode usar para chamar um método em algum intervalo pré-determinado mais tarde - ele agenda uma chamada que será realizada em um momento posterior, mas todas as outras coisas que o thread manipula (como IU e carregamentos de dados) ainda continua.
Obviamente, você também pode usar as chamadas sleep () e usleep () padrão do Unix. (Se estiver escrevendo Cocoa, eu ficaria com [NSThread sleepForTimeInterval:], no entanto.)
Se você usar NSThread sleepForTimeInterval (código comentado) para dormir, a busca de dados será bloqueada, mas + [NSThread sleepForTimeInterval:] (método checkLoad) não bloqueará a busca de dados.
Meu código de exemplo abaixo:
- (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];
}
}