1

Мне нужно сделать асинхронный вызов, чтобы второй метод вызывался только после завершения первого. Оба метода - это сетевые вызовы. Что-то вроде этого:Asynchronous swift 3

signIn() 
getContacts() 

Я хочу, чтобы убедиться, что getContacts только вызывается после завершения входа в аккаунт. FWIW, я не могу редактировать подписи методов, потому что они из SDK Google.

Это то, что я пробовал:

let queue = DispatchQueue(label: "com.app.queue") 

queue.async { 
signIn() 
getContacts() 

} 
+1

Изобразительное. В чем был вопрос? – JeremyP

+0

Как правило, такие методы, как ваш знак 'signIn', передаются в замыкание, которое вызывается после завершения метода, например:' signIn() {getContacts()} ', хотя для этого требуется реинжиниринг метода. – Robert

ответ

1

Асинхронные вызовы по своей природе не запускаются до завершения, а затем вызывают следующее. Они немедленно возвращаются, прежде чем задача, которую они попросят завершить, даже запланирована.

Вам нужен какой-то метод, чтобы вторая задача дождалась завершения первой.

NauralInOva дал одно хорошее решение: используйте пару NSOprations и заставьте их зависеть друг от друга. Вы также можете поместить 2 операции в очередность очереди, а вторая не будет начинаться до тех пор, пока первая не будет завершена.

Однако, если эти вызовы вызвать операцию асинхронной в другом потоке, они все еще могут вернуться и очередь операция может вызвать второй операции (getContacts() вызова, не дожидаясь signIn(), чтобы закончить.

Другой вариант, чтобы установить до первой функции взять функцию обратного вызова:

signIn(callback: { 
    getContacts() 
} 

Третий вариант заключается в разработке объекта регистрации, которая принимает делегат и объект Войти назовете signInComplete метод на делегат, как только зарегистрировались завершена

.

Это настолько распространенная вещь, что большинство сетевых API создаются для этого «из коробки». Я был бы шокирован, если бы у Google API не было средств для этого.

Какую платформу Google вы используете? Можете ли вы указать на документацию?

+0

Вы абсолютно правы, я не знаю, как я это пропустил. У них действительно есть метод didSignIn, который вызывается после того, как знак уже завершен, и мне просто нужно было установить метод getContacts, и теперь он работает нормально. Спасибо за вашу помощь. –

1

Вы ищете NSOperation. Вы можете использовать NSOperation для совместной работы операций с использованием зависимостей. После завершения одной операции он может передать блок завершения в следующую операцию. Пример для случая использования может быть:

// AuthOperation is a subclass of NSOperation 
let signInOperation = AuthOperation() 
// ContactsOperation is a subclass of NSOperation 
let getContactsOperation = ContactsOperation() 

getContactsOperation.addDependency(signInOperation) 

Ray Wenderlich имеет большой учебник, охватывающий NSOperation. В учебнике используется операция загрузки для асинхронного загрузки изображений с зависимостью, которая будет фильтровать фотографию по завершении сетевого запроса.

Компания Apple использует отличные sample project, которые используют операции с асинхронными сетевыми запросами.

+0

Спасибо, что было хорошо прочитано. Не то, что мне нужно, но, возможно, лучший ответ на мой вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^