Как сделать паузу между функциями в Xcode? - PullRequest
0 голосов
/ 03 июня 2019

Похоже, что в моем приложении для iOS (которое я пишу в Xcode с Swift) функции, запускаемые после нажатия кнопки, запускаются сразу, без учета каких-либо спящих функций между ними.

Здесьнемного предыстории:

Чтобы создать линию связи между моим приложением для iPhone и Raspberry Pi, я использую хранилища json (https://jsonstorage.net/). То, как приложение работает, это обновление jsonbin, созданный на вышеуказанном сайте и отправляющий электронное письмо в виде текстового сообщения в Raspberry Pi (Raspberry Pi использует Adafruit FONA для обработки текстовых сообщений), и это вызывает запуск Pi для сбора данных из корзины json.был обновлен строкой, которая сообщает Pi, что делать. Получив эту строку, Pi что-то делает и добавляет информацию в другую корзину json. Затем я получаю доступ к этой корзине в своем приложении и использую ее для обновления определенных переменных.

Вот код, где выполняются функции (нажата кнопка, которая выдвигает новый контроллер вида; здесьон viewDidLoad() функция для этого нового VC):

override func viewDidLoad() {
    super.viewDidLoad()
    uploadJsonData(dataString:"varsData")
    sendEmail(body:"app varsData")
    sleep(15)
    collectData()
}

Концептуально, этот код должен работать.Если у меня есть кнопка, которая при нажатии пользователем запускает функции uploadJsonData() и sendEmail(), то пользователь ждет 15 секунд (обратите внимание, что если у меня есть sleep(15) как часть первой кнопки, этоt), затем пользователь нажимает другую кнопку, которая запускает функцию collectData(), затем код будет работать, как ожидается, и переменные будут обновлены новыми данными сразу после нажатия этой второй кнопки.Однако это не относится к приведенному выше коду: вместо этого переменные обновляются с данными до обновления второго json bin, а сам второй json bin не обновляется, по крайней мере, через 15 секунд после всех функцийзапустить, независимо от продолжительности функции сна (подразумевая, что сон ничего не делает, и все запускается сразу, или, по крайней мере, все взаимодействия с Интернетом происходят сразу).У кого-нибудь есть идеи относительно того, почему это / как это исправить?

1 Ответ

0 голосов
/ 03 июня 2019

Эй, вы можете использовать dispatchQueue для задержки, как я использовал ниже,

override func viewDidLoad() {
    super.viewDidLoad()
    uploadJsonData(dataString:"varsData")
    sendEmail(body:"app varsData")
    DispatchQueue.main.asyncAfter(deadline: .now() + 15) {
       collectData()
    }  
}
...