/ / Запускати код лише після завершення виконання асинхронної функції - ios, swift, asynchronous, parse.com

Запустити код тільки після того, як асинхронна функція завершує виконання - ios, swift, asynchronous, parse.com

Я відносно новачок у Swift та Xcode загалом, і я знаходжу багато труднощів, намагаючись це зрозуміти.

Я розробляю програму, яка використовує Parse.com серверний сервер.Щоб не блокувати основний потік, щоразу, коли програма завантажує що-небудь із сервера, це робиться в іншому потоці, асинхронно. Однак решта коду продовжує виконуватися в основному потоці, і він аварійно завершує роботу, коли дані, які він повинен мати з сервера, ще не завантажені. Я хотів би знати, як викликати функції для запуску після завершення асинхронної функції, і це потрібно робити для функцій в окремих файлах.

Я читав, що закриття може допомогти в цьому, але я знайшов там синтаксис дуже складним, і пояснення було б вдячне. Але будь-який спосіб був би дуже корисним.

Дякую

Відповіді:

13 за відповідь № 1

Ну, ви просто викликаєте функцію в кінці асинхронного зворотного виклику. Саме тоді асинхронний зворотний виклик закінчився - це коли все інше в асинхронному зворотному виклику закінчився! Так, наприклад:

func myMethod() {
// ... code ...
somebody.doSomethingWith(someObject, asynchronousCallback: {
(thing, otherThing) in
// ... do whatever
// --> CALL THE FUNCTION!
})
// ... code ...
}

Якщо проблема в тому, що ви цього не робите знати яку функцію викликати, ви можете налаштувати навколишню функцію / об'єкт так, щоб хтось міг руки ви функція, яка є тим, що ви називаєте там, де я сказав "викликати функцію" у вищезазначеному.

Наприклад:

func myMethod(f:() -> ()) { // we receive the function as parameter
// ... code ...
somebody.doSomethingWith(someObject, asynchronousCallback: {
(thing, otherThing) in
// ... do whatever
// --> CALL THE FUNCTION, by saying:
f()
})
// ... code ...
}

3 для відповіді № 2

Розширюючи відповідь Метта, ви можете зробити myMethod методом, який приймає замикання як параметр:

​func​ ​myMethod​(​completionBlock​: (result: String) -> ())
{
// ... code ...
somebody.doSomethingWith(someObject, asynchronousCallback: {
(thing, otherThing) in
// ... do whatever
completionBlock(thing)
})
// ... code ...
}