Я использую OAuthSwift для доступа к goodreads api. Сначала у меня есть api-вызов, чтобы получить идентификатор пользователя. Затем, используя этот идентификатор, я получаю книги, которые пользователь имеет на полке. Затем я проверяю, есть ли книги с определенным заголовком, а если нет, я снова вызываю api, чтобы создать эту книгу. И затем, будучи уверенным, что книга есть, я публикую обновление статуса о его прогрессе.Альтернативы множеству вложенных блоков завершения?
Это код, чтобы получить идентификатор пользователя:
oAuth.client.get(
"https://www.goodreads.com/api/auth_user",
success: {
data, response in
// Here I use the returned ID to get the books.
},
failure: {
error in
//…
}
)
После того, как я получил идентификатор, мне нужно, чтобы использовать его для следующего апи вызова, который получает книгу. Дело в том, что я не могу просто добавить следующий вызов после первого, потому что они асинхронны, поэтому второй вызов начнется, прежде чем я получу идентификатор из первого.
То, что я делаю, заключается в том, чтобы добавить второй вызов api внутри этого success
закрытия (я указал его в коде с комментарием). Итак, у меня есть два очень похожих фрагмента кода один внутри другого; когда первый вызов api преуспевает, он вызывает следующее. Но тогда я должен использовать результат этого второго вызова, чтобы решить, добавлю ли я новую книгу или нет. Поэтому у меня есть третий вызов api (чтобы добавить книгу) внутри блока успеха второго вызова, который находится внутри блока успеха первого вызова ... и вы можете видеть, что все начинает становиться довольно запутанным. И он даже не останавливается на достигнутом: у меня есть четвертый вызов api для публикации обновления состояния, и он находится внутри обработчика завершения третьего вызова, который находится внутри второго, который находится внутри первого.
Итак ... что я должен делать вместо этого? Извините, если это глупый вопрос, но я новичок в быстром и программировании в целом.
Вы можете использовать PromiseKit http://promisekit.org – Paulw11
Вы можете обернуть вызовы в 'NSOperations' и поместить их в последовательный' NSOperationQueue' – dan
@Paul Ничего себе, это выглядит многообещающе. (Посмотри, что я там сделал?) Я посмотрю, спасибо! – dbmrq