Как я могу преобразовать эту функцию в функцию броска? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь развить свои навыки в Swift и буду рад любой помощи в том, как пользователь «бросает» в функцию ниже.

Я думаю, что это удобный способ выбросить пользователя, чтобы я мог представить ему контроллер предупреждений, сообщая ему, что не так:

    enum networkError: Error {
    case invalidURL
    case invalidUserinfo
    case invalidData
    case standard
    case nilProperty
}

func createUsers(completion: @escaping(User) -> ()) {

    REF_USER.observe(.childAdded) { (snapshot) in
        let uid = snapshot.key
        guard
            let dict = snapshot.value as? Dictionary<String,String>,
            let fullname = dict["fullname"],
            let profileImageUrl = dict["profileImageUrl"]
        else { return }

       guard let url = URL(string: profileImageUrl) else { return }

       URLSession.shared.dataTask(with: url) { (d, r, e) in
        if e != nil {
            print("DEBUG: Error fetching users profile image", e)
            return
        }
        guard let data = d else { return }
        guard let image = UIImage(data: data) else { return }

        let user = User(uid: uid, fullname: fullname, profileImage: image, isFollowed: false)
        completion(user)
       }.resume()
    }

}

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

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

  • Если вы вернете пользователя, вызывающий абонент получит .success с этим пользователем, завернутым внутрь.

  • Если вы бросите, вызывающий абонент получит .failure с брошенной ошибкой, завернутой внутрь.

И на дальней стороне: вызывающий может отправить Result сообщение get, чтобы развернуть Result с такой же крутостью.

1 голос
/ 09 апреля 2020

Вы не бросаете, когда у вас есть функция с обратным вызовом, которая полностью испортила бы все. Вы изменяете аргумент обратного вызова на enum с двумя случаями: ошибка и результат. Это на самом деле стандартный тип в Swift5.

...