Який еквівалент Java's Thread.sleep () в Objective-C / Cocoa?


112

У Java ви можете призупинити виконання поточного потоку на деякий час, використовуючи Thread.sleep(). Чи є щось подібне в Objective-C?

Відповіді:


160

Так, є + [NSThread sleepForTimeInterval:]

(Тільки щоб ви знали для майбутніх питань, Objective-C - це сама мова; бібліотека об'єктів (один з них принаймні) - какао.)


6
Thnx! <br> для подальшої довідки, визначення є насправді + [NSThread sleepForTimeInterval:] (так, використовується як [NSThread sleepForTimeInterval: 0.1]).
TinkerTank

Це прекрасно. Дякую! Я щойно закінчив свої анімаційні блоки, і це спрацювало як шарм.
RileyE

як щодо сну на головному тераді?
jerinho.com

1
Це ж; головна нитка - це просто нитка. Спати на головній нитці, як правило, погана ідея, оскільки це робить вашу програму невідчутливою.
smorgan

4
для тих, хто цікавиться, [NSThread sleepForTimeInteval:] те саме, що [[NSThread currentThread] sleepForTimeInterval:].
pnizzle


40

Чому ти спиш? Коли ви спите, ви блокуєте інтерфейс користувача, а також будь-яке завантаження фонової URL-адреси не в інших потоках (використання асинхронних методів NSURL все ще працює на поточному потоці).

Швидше за все, що ви дійсно хочете, це виконувати Selector: withObject: AfterDelay. Це метод на NSObject, який ви можете використовувати для виклику методу через деякий заздалегідь визначений інтервал пізніше - він планує виклик, який буде виконуватися пізніше, але всі інші матеріали, що обробляються потоками (як інтерфейс користувача та навантаження даних), все ще тривають.


43
Сон мені корисний для тестування. Я можу імітувати деякі затримки в мережі, щоб переконатися, що моя програма реагує належним чином. В даний час я тестую локальний веб-сервер, тому все по суті миттєво.
brantonb

6
Сон - це неправильний спосіб перевірки затримок у мережі. Подивіться на відповідь на це питання stackoverflow.com/questions/1502060/…, щоб побачити, як перевірити змінні швидкості мереж у тренажері. Оскільки сплячий основний потік блокує все, ви зовсім не імітуєте мережеву затримку, а більше призупинення роботи програми.
Kendall Helmstetter Gelner

Сон корисний для моделювання того, що робиться під час операції з'єднання на потоці JAVA. Ви спите 10 мільйонів, перевірте, чи нитка відмерла, тоді ви можете розібратися.
Майк S

1
Якщо ви спите будь-який проміжок часу, ваша нитка буде точно в тому ж стані, що і до сну. Це не гарний тест, оскільки в реальному світі ваша заявка буде оброблятись, а не спити. Ось чому важливо розібратися, як пройти тестування, не покладаючись на сон.
Kendall Helmstetter Gelner

+1 Дякуємо, що вказали на альтернативне рішення! Тільки те, що я шукав :)
jpswain

7

Звичайно, ви також можете використовувати стандартні дзвінки для сну () та usleep (). (Якщо пишу какао, я б залишився з режимом [NSThread sleepForTimeInterval:].)


5

Якщо ви використовуєте для сну 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];
    }
}

0

usleep () також може бути використаний, як ive використовував це для паузи поточного потоку в рази

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.