Qual é o equivalente de Thread.sleep () do Java em Objective-C / Cocoa?

112

Em Java, você pode suspender a execução do thread atual por um período de tempo usando Thread.sleep(). Existe algo assim em Objective-C?

levi
fonte

Respostas:

160

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.)

smorgan
fonte
6
Thnx! <br> para referência futura, a definição é na verdade + [NSThread sleepForTimeInterval:] (então, usado como [NSThread sleepForTimeInterval: 0.1]).
TinkerTank
Isto é perfeito. Obrigado! Acabei de terminar meus blocos de animação e funcionou como um encanto.
RileyE
que tal dormir no therad principal?
jerinho.com 12/12/12
1
É o mesmo; o tópico principal é apenas um tópico. Dormir no thread principal geralmente é uma má ideia, pois torna o programa não responsivo.
smorgan
4
para aqueles que estão se perguntando, [NSThread sleepForTimeInteval:] é o mesmo que [[NSThread currentThread] sleepForTimeInterval:].
pnizzle
94

Dormindo por um segundo em Java:

Thread.sleep(1000);

Dormir por um segundo no Objetivo C:

[NSThread sleepForTimeInterval:1.0f];
Rok Strniša
fonte
40

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.

Kendall Helmstetter Gelner
fonte
43
Dormir é útil para fins de teste. Posso simular alguns atrasos de rede para garantir que meu aplicativo responda corretamente. Atualmente estou testando em um servidor web local, então tudo é essencialmente instantâneo.
brantonb
6
Dormir é a maneira errada de testar atrasos na rede. Veja a resposta para esta pergunta stackoverflow.com/questions/1502060/… para ver como testar velocidades variáveis ​​de redes no simulador. Como suspender o thread principal bloqueia tudo, você não está simulando um atraso de rede, mas sim uma suspensão do aplicativo.
Kendall Helmstetter Gelner
A suspensão é útil para simular o que é feito em uma operação de junção em um encadeamento JAVA. Você dorme por 10 millis, verifique se o thread está morto e então você pode desalocá-lo.
Mike S de
1
Se você dormir por qualquer período de tempo, seu fio estará exatamente no mesmo estado em que estava antes de você dormir. Não é um bom teste porque no mundo real seu aplicativo estará processando, não adormecido. É por isso que é importante descobrir como fazer o teste sem depender do sono.
Kendall Helmstetter Gelner de
+1 Obrigado por apontar uma solução alternativa! Exatamente o que eu estava procurando :)
jpswain
7

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.)

Bill Heyman
fonte
5

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];
    }
}
wu liang
fonte
0

usleep () também pode ser usado como ive usei para pausar o tópico atual às vezes

j2emanue
fonte