Jaki jest odpowiednik Thread.sleep () języka Java w Objective-C / Cocoa?

112

W Javie możesz zawiesić wykonywanie bieżącego wątku na pewien czas używając Thread.sleep(). Czy jest coś takiego w Objective-C?

levi
źródło

Odpowiedzi:

160

Tak, jest + [NSThread sleepForTimeInterval:]

(Tak, żebyś wiedział na przyszłe pytania, Objective-C to sam język; biblioteka obiektów (przynajmniej jeden z nich) to Cocoa.)

smorgan
źródło
6
Dzięki! <br> na przyszłość, definicja to w rzeczywistości + [NSThread sleepForTimeInterval:] (więc używana jak [NSThread sleepForTimeInterval: 0.1]).
TinkerTank
To jest doskonałe. Dzięki! Właśnie skończyłem moje bloki animacji i zadziałało to jak urok.
RileyE
co powiesz na spanie na głównej sali?
jerinho.com
1
To jest to samo; główny wątek to tylko wątek. Spanie w głównym wątku jest jednak zwykle złym pomysłem, ponieważ powoduje, że program nie reaguje.
smorgan
4
dla tych, którzy się zastanawiają, [NSThread sleepForTimeInteval:] jest tym samym, co [[NSThread currentThread] sleepForTimeInterval:].
pnizzle
94

Spanie przez jedną sekundę w Javie:

Thread.sleep(1000);

Spanie przez jedną sekundę w celu C:

[NSThread sleepForTimeInterval:1.0f];
Rok Strniša
źródło
40

Dlaczego śpisz? Gdy śpisz, blokujesz interfejs użytkownika, a także ładowanie dowolnego adresu URL w tle, którego nie ma w innych wątkach (przy użyciu metod asynchronicznych NSURL nadal działa w bieżącym wątku).

Szanse są tym, czego naprawdę chcesz, to performSelector: withObject: AfterDelay. Jest to metoda na NSObject, której możesz użyć do wywołania metody w pewnym z góry określonym interwale później - planuje wywołanie, które zostanie wykonane później, ale wszystkie inne rzeczy obsługiwane przez wątek (takie jak ładowanie interfejsu użytkownika i danych) będą nadal kontynuować.

Kendall Helmstetter Gelner
źródło
43
Spanie jest dla mnie przydatne do celów testowych. Mogę symulować niektóre opóźnienia w sieci, aby upewnić się, że moja aplikacja działa prawidłowo. Obecnie testuję na lokalnym serwerze internetowym, więc wszystko jest zasadniczo natychmiastowe.
brantonb
6
Uśpienie to niewłaściwy sposób testowania opóźnień w sieci. Spójrz na odpowiedź na to pytanie stackoverflow.com/questions/1502060/…, aby zobaczyć, jak przetestować zmienne prędkości sieci w symulatorze. Ponieważ uśpienie głównego wątku blokuje wszystko, w ogóle nie symulujesz opóźnienia sieci, ale raczej zawieszenie aplikacji.
Kendall Helmstetter Gelner
Uśpienie jest przydatne do symulacji operacji łączenia w wątku JAVA. Śpisz przez 10 milisekund, sprawdź, czy nić jest martwa, a następnie możesz ją zwolnić.
Mike S
1
Jeśli będziesz spać przez jakiś czas, twoja nić będzie dokładnie w tym samym stanie, w jakim była przed snem. To nie jest dobry test, ponieważ w rzeczywistości Twoja aplikacja będzie przetwarzać, a nie spać. Dlatego ważne jest, aby dowiedzieć się, jak przeprowadzić test bez polegania na śnie.
Kendall Helmstetter Gelner
+1 Dziękujemy za wskazanie alternatywnego rozwiązania! Właśnie tego szukałem :)
jpswain
7

Oczywiście możesz także użyć standardowych wywołań sleep () i usleep () w Uniksie. (Jeśli piszę Cocoa, pozostałbym przy [NSThread sleepForTimeInterval:].)

Bill Heyman
źródło
5

Jeśli użyjesz NSThread sleepForTimeInterval (kodu z komentarzem) do uśpienia, pobieranie danych zostanie zablokowane, ale + [NSThread sleepForTimeInterval:] (metoda checkLoad) nie zablokuje pobierania danych.

Mój przykładowy kod jak poniżej:

- (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
źródło
0

Funkcja usleep () może być również używana jako ive, aby czasami wstrzymywać bieżący wątek

j2emanue
źródło