W Javie można zawiesić wykonywanie bieżącego wątku przez pewien czas za pomocą Thread.sleep(). Czy jest coś takiego w Objective C?Jaki jest odpowiednik Java's Thread.sleep() w Objective-C/Cocoa?
Odpowiedz
Tak, tam +[NSThread sleepForTimeInterval:]
(Tak wiesz dla przyszłych pytań, Objective-C jest sam język;. Bibliotekę obiektów (jedna z nich przynajmniej) jest Cocoa)
Oczywiście , możesz również użyć standardowych wywołań funkcji sleep() i usleep(). (Jeśli piszę Cocoa, zostanę przy [NSThread sleepForTimeInterval:], jednak).
Dlaczego śpisz? Podczas snu blokujesz interfejs użytkownika, a także ładowanie adresu URL w tle nie w innych wątkach (korzystanie z metod asynchronicznych NSURL nadal działa w bieżącym wątku).
Istnieje duża szansa na wykonanie selektora: withObject: AfterDelay. Jest to metoda na NSObject, której możesz użyć do wywołania metody w pewnym uprzednio określonym odstępie czasu później - planuje ona wywołanie, które zostanie wykonane w późniejszym czasie, ale wszystkie inne rzeczy obsługiwane przez wątek (takie jak UI i ładunki danych) będą nadal kontynuować.
Spanie jest przydatne dla mnie w celach testowych. Mogę zasymulować opóźnienia w sieci, aby upewnić się, że moja aplikacja reaguje poprawnie. Obecnie testuję na lokalnym serwerze sieciowym, więc wszystko jest w zasadzie natychmiastowe. – brantonb
Uśpienie to niewłaściwy sposób na sprawdzenie opóźnień sieci. Popatrz na odpowiedź na to pytanie http://stackoverflow.com/questions/1502060/iphone-intermittent-network- testowanie, aby zobaczyć, jak przetestować zmienne prędkości sieci w symulatorze. Ponieważ zasypianie głównego wątku blokuje wszystko, w ogóle nie symulujesz opóźnienia sieci, ale więcej zawieszenia aplikacji. –
Spanie jest przydatne do symulacji czynności wykonywanych w operacji łączenia na wątku JAVA. Śpisz przez 10 milis, sprawdź, czy wątek jest martwy, możesz go zwolnić. –
usleep() może być również używany jako ive używany to wstrzymanie bieżącego wątku czasami
Jeśli używasz NSThread sleepForTimeInterval (kod skomentował) spać, pobierania danych zostanie zablokowana, ale + [NSThread sleepForTimeInterval: ] (metoda checkLoad) nie będzie blokować 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];
}
}
spania dla jednej sekundy w Javie:
Thread.sleep(1000);
spania dla jednego drugiego w Objective C:
[NSThread sleepForTimeInterval:1.0f];
thnx !
dla przyszłego odniesienia, definicja jest w rzeczywistości + [NSThread sleepForTimeInterval:] (tak, używane jak [NSThread sleepForTimeInterval: 0.1]). – TinkerTank
To jest idealne. Dzięki! Właśnie skończyłem moje bloki animacji i działało jak czar. – RileyE
Co powiesz na spanie na głównym termorze? – Dagon