Odpowiedzi:
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.)
Spanie przez jedną sekundę w Javie:
Thread.sleep(1000);
Spanie przez jedną sekundę w celu C:
[NSThread sleepForTimeInterval:1.0f];
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ć.
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:].)
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];
}
}