Відповіді:
Так, є + [NSThread sleepForTimeInterval:]
(Тільки щоб ви знали для майбутніх питань, Objective-C - це сама мова; бібліотека об'єктів (один з них принаймні) - какао.)
Спати одну секунду на Java:
Thread.sleep(1000);
Спати одну секунду в Цілі C:
[NSThread sleepForTimeInterval:1.0f];
Чому ти спиш? Коли ви спите, ви блокуєте інтерфейс користувача, а також будь-яке завантаження фонової URL-адреси не в інших потоках (використання асинхронних методів NSURL все ще працює на поточному потоці).
Швидше за все, що ви дійсно хочете, це виконувати Selector: withObject: AfterDelay. Це метод на NSObject, який ви можете використовувати для виклику методу через деякий заздалегідь визначений інтервал пізніше - він планує виклик, який буде виконуватися пізніше, але всі інші матеріали, що обробляються потоками (як інтерфейс користувача та навантаження даних), все ще тривають.
Звичайно, ви також можете використовувати стандартні дзвінки для сну () та usleep (). (Якщо пишу какао, я б залишився з режимом [NSThread sleepForTimeInterval:].)
Якщо ви використовуєте для сну NSThread sleepForTimeInterval (коментований код), отримання даних буде заблоковано, але + [NSThread sleepForTimeInterval:] (метод checkLoad) не заблокує отримання даних.
Мій приклад, як показано нижче:
- (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];
}
}