От асинхронного / ожидания в C # до замыканий в Swift - PullRequest
0 голосов
/ 24 декабря 2018

Исходя из фона C # с асинхронным / ожидающим мышлением, у меня возникают некоторые проблемы с пониманием того, как правильно использовать замыкания в Swift.

Я использую следующий метод getMessagingId, чтобы получить сообщения FirebaseЯ БЫ.После того как я получу удостоверение личности через закрытие, я хочу что-то сделать с этим удостоверением.Однако я просто не знаю, как получить это значение из InstanceID.instanceID().instanceID(...), чтобы потом использовать его в методах processMessagingId() и registerMessagingId().В C # я бы использовал async / await для достижения этого.

// Register this device
public func registerThisDevice() {
    // get the messaging ID
    var messagingId = getMessagingId()

    // process this messaging ID
    processMessagingId(messagingId)

    // register this messaging ID
    registerMessagingId(messagingId)
}

// get the messaging ID for firebase messaging
func getMessagingId() -> String {
    InstanceID.instanceID().instanceID(handler: { (result, error) in
        if let error = error {
            print("Error fetching messaging id: \(error)")
        } else if let result = result {
            print("Messaging id is \(result.token)")
        }
    })
    return ""
}

handler - обработчик завершения, который также использует ключевое слово @escaping.

Я прочитал пару статей о завершенииобработчики, а также @escaping.Но я просто не могу обернуться вокруг этого.

1 Ответ

0 голосов
/ 24 декабря 2018

Когда вы делаете асинхронные вызовы, вам нужно подождать, пока асинхронный вызов не закончится, и после этого вы сможете работать с полученными данными.Для этого мы используем обработчики завершения в Swift.

Начните с объявления параметра завершения вместо возвращаемого значения

func getMessagingId(completion: @escaping (String) -> ())

Что это значит?

Упрощенно, вы объявляете, что должно произойти, когда из этого метода вызывается completion.Вы хотите передать параметр типа String, который вы можете использовать при закрытии completion, а затем вы хотите вызвать код внутри completion замыкания

Так что теперь давайте вызовем наши completion ив качестве параметра давайте передадим наше сообщение

if let error = error {
    completion("Error fetching messaging id: \(error)")
} else if let result = result {
    completion("Messaging id is \(result.token)")
}

Хорошо, теперь давайте вызовем наш метод

getMessagingId { message in // here you give `String` parameter name
    print(message) // this code gets executed when you call `completion` in `getMessagingId`
}

Теперь, когда вы сможете это понять, вы можете передать несколько параметров, напримернапример success, error, messageId, все, что вам нужно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...