Как нить спать в Swift на Linux - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь написать небольшую программу, которая запускается в цикле и выполняет некоторый код каждые 30 секунд.

Меня не очень заботит, чтобы он был точным по времени, но мне важно, чтобы программа могла компилироваться и запускаться на платформе linux, а также чтобы ее можно было собрать и протестировать с помощью менеджера пакетов swift.

Мой первый выстрел был похож на

while true {
    print("doing the work")
    sleep(30) // also tried usleep(30*1000*1000)
}

Очевидно, что в swift 4 нет ссылки на sleep(_:), которую я могу найти, и этот код не компилируется. Я попытался использовать Timer, но программа закрывается, как только таймер начинает тикать, потому что таймер работает в фоновом режиме, и единственной задачей основного потока является его планирование.

Это должно быть проще, чем кажется. Что мне не хватает в управлении потоками в Swift, которое объясняет, как трудно это найти?

--- РЕДАКТИРОВАТЬ Чтобы выяснить, почему это отличается от многочисленных предлагаемых дубликатов:

Я явно пытаюсь перевести основной поток в спящий режим, и, как я упоминал выше, я не смог заставить Swift под Linux скомпилировать, используя функцию sleep, предложенную в других принятых ответах. Контекст моей программы в контексте CLI означает, что отложенные действия в фоновом потоке, как предлагают многочисленные другие доступные источники, здесь не будут работать. Кроме того, этот CLI работает в Linux, и поэтому я не могу зависеть от библиотек только для iOS.

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Вы можете импортировать sleep из Glibc или Darwin, но еще лучше, вы можете использовать Thread.sleep(forTimeInterval:) из Foundation

import Foundation

while true {
    print("hello")
    Thread.sleep(forTimeInterval: 0.1)
}
0 голосов
/ 27 июня 2018

Попробуйте это

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(30), execute: {
    // Put your code which should be executed with a delay here
})
...