Qual è l'equivalente di Thread.sleep () di Java in Objective-C / Cocoa?


112

In Java è possibile sospendere l'esecuzione del thread corrente per un certo periodo di tempo utilizzando Thread.sleep(). C'è qualcosa di simile in Objective-C?

Risposte:


160

Sì, c'è + [NSThread sleepForTimeInterval:]

(Solo così sai per domande future, Objective-C è il linguaggio stesso; la libreria di oggetti (uno di questi almeno) è Cocoa.)


6
Thnx! <br> per riferimento futuro, la definizione è in realtà + [NSThread sleepForTimeInterval:] (quindi, usato come [NSThread sleepForTimeInterval: 0.1]).
TinkerTank

Questo è perfetto. Grazie! Ho appena finito i miei blocchi di animazione e ha funzionato a meraviglia.
RileyE

che ne dici di dormire sul main therad?
jerinho.com

1
È lo stesso; il filo principale è solo un filo. Dormire sul thread principale di solito è una cattiva idea, poiché rende il tuo programma non reattivo.
smorgan

4
per coloro che si chiedono, [NSThread sleepForTimeInteval:] è lo stesso di [[NSThread currentThread] sleepForTimeInterval:].
pnizzle

94

Dormire per un secondo in Java:

Thread.sleep(1000);

Dormire per un secondo nell'Obiettivo C:

[NSThread sleepForTimeInterval:1.0f];

40

Perché stai dormendo? Quando dormi, stai bloccando l'interfaccia utente e anche il caricamento di qualsiasi URL in background non in altri thread (l'uso dei metodi asincroni NSURL funziona ancora sul thread corrente).

È probabile che ciò che vuoi veramente sia performSelector: withObject: AfterDelay. Questo è un metodo su NSObject che puoi utilizzare per chiamare un metodo in un intervallo predeterminato in un secondo momento: pianifica una chiamata che verrà eseguita in un secondo momento, ma tutte le altre cose gestite dal thread (come l'interfaccia utente e i caricamenti dei dati) lo faranno continuare ancora.


43
Dormire mi è utile a scopo di test. Posso simulare alcuni ritardi di rete per assicurarmi che la mia app risponda correttamente. Attualmente sto testando su un server web locale, quindi tutto è essenzialmente istantaneo.
brantonb

6
Il sonno è il modo sbagliato per testare i ritardi di rete. Guarda la risposta a questa domanda stackoverflow.com/questions/1502060/… per vedere come testare le velocità variabili delle reti nel simulatore. Poiché dormire sul thread principale blocca tutto, non stai simulando affatto un ritardo di rete, ma più una sospensione dell'app.
Kendall Helmstetter Gelner

La sospensione è utile per simulare ciò che viene fatto in un'operazione di unione su un thread JAVA. Dormi per 10 millisecondi, controlla se il thread è morto, quindi puoi deallocarlo.
Mike S

1
Se dormi per un certo periodo di tempo, il tuo thread sarà esattamente nello stesso stato in cui era prima di dormire. Non è un buon test perché nel mondo reale la tua applicazione verrà elaborata, non inattiva. Ecco perché è importante capire come eseguire il test senza fare affidamento sul sonno.
Kendall Helmstetter Gelner

+1 Grazie per aver indicato una soluzione alternativa! Proprio quello che stavo cercando :)
jpswain

7

Ovviamente, potresti anche usare le chiamate standard Unix sleep () e usleep (). (Se scrivessi Cocoa, rimarrei con [NSThread sleepForTimeInterval:], tuttavia.)


5

Se usi NSThread sleepForTimeInterval (codice commentato) per dormire, il recupero dei dati verrà bloccato, ma + [NSThread sleepForTimeInterval:] (metodo checkLoad) non bloccherà il recupero dei dati.

Il mio codice di esempio come di seguito:

- (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];
    }
}

0

usleep () può anche essere usato come ive lo ha usato per mettere in pausa il thread corrente, a volte

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.