Несколько блоков завершения - PullRequest
0 голосов
/ 06 мая 2019

Я следовал этому руководству:

https://medium.com/swift2go/building-grpc-client-ios-swift-note-taking-app-6133c7d74644

Но я не понимаю этот кусок кода, так как он получил несколько обработчиков завершения, и я не понимаю, как работает этот код (я знаю этоявляется частью одноэлементного класса, но что делает этот код и что такое «notes? .notes» ???:

func listNotes(completion: @escaping([Note]?, CallResult?) -> Void) {
    _ = try? client.list(Empty(), completion: { (notes, result) in
        DispatchQueue.main.async {
            completion(notes?.notes, result)
        }
    })
}

Я застрял на этом месте 8 дней подряд, поэтому, пожалуйста, помогите мне :(

1 Ответ

2 голосов
/ 06 мая 2019

listNotes (_ :) имеет свой собственный блок завершения с именем Завершение.

В теле завершения listNotes (_ :), listNotes (_ :) вызывает асинхронную вызывающую функцию для клиентской переменной с именем list (_ :, _ :).

Список функций (_ :, _ :) имеет свой собственный блок завершения и передает в него две переменные;заметки и результат.

Когда выполняется блок завершения списка (_ :, _ :), первое, что происходит, - это создание блока GCD для выполнения завершения списка ListNotes (_ :) в главном потоке.

Затем он передает две блочные переменные из замыкания списка (_ :, _ :) вперед в замыкание listNotes (_ :);свойство в необязательной переменной notes, также называемое notes (должно быть изменено imo) и result.

Одна очень важная вещь, которую следует здесь отметить, состоит в том, что, поскольку client.list (_ :, _ :) является функцией выброса, и ошибка никогда не обнаруживается, если эта функция бросает, listNotes (_ :) никогда не будетвыполнить блок завершения.Я вообще считаю, что это очень плохая практика, поскольку кто-то может зависеть от этой функции, чтобы выполнить ее закрытие независимо от успеха.По сути, вы настраиваете себя на нарушение обещания, которое вы дали в сигнатуре функции.

...