Який еквівалент 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.