Как использовать обработчик завершения, чтобы поместить изображение в представление SwiftUI - PullRequest
1 голос
/ 24 октября 2019

Я пробовал это, но я не знал, как использовать результаты в SwiftUI View:

func getProfilePicture(_ completion: @escaping ((UIImage) -> Void)) {

    Alamofire.request(GIDSignIn.sharedInstance()?.currentUser.profile.imageURL(withDimension: 75) ?? "https://httpbin.org/image/png").responseImage { response in

        if let image = response.result.value {
            completion(image)

        }
    }
}

Если вы можете помочь, я хотел бы поместить возвращенное изображение из обработчика завершенияв этом представлении:

struct ProfileView: View {
let profileInfo = ProfileInfo()
var placeHolderImage = Image(systemName: "person")

var body: some View {
    Group {
            placeHolderImage
                .clipShape(Circle())
                .overlay(
                    Circle().stroke(Color.white, lineWidth: 4))
                .shadow(radius: 10)
                .padding(10)
    }

}

}

Я хотел бы, чтобы это возвращало UIImage, чтобы я мог в конечном итоге использовать его в представлении SwiftUI. Я уже пытался использовать метод с обработчиком завершения @escaping, но я не мог понять, как использовать его для решения проблемы. Спасибо!

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Используйте обработчик завершения, как показано ниже,

func getProfilePicture(_ completion: @escaping ((UIImage) -> Void)) {

        Alamofire.request(GIDSignIn.sharedInstance()?.currentUser.profile.imageURL(withDimension: 75) ?? "https://httpbin.org/image/png").responseImage { response in

            if let image = response.result.value {
                completion(image)

            }
        }
    }
0 голосов
/ 24 октября 2019

Вы можете попробовать что-нибудь, пусть это:

struct ProfileView: View {
    @State var placeHolderImage = Image(systemName: "person")


    var body: some View {
        Group {
            placeHolderImage
                .clipShape(Circle())
                .overlay(
                    Circle().stroke(Color.white, lineWidth: 4))
                .shadow(radius: 10)
                .padding(10)
        }.onAppear{
            getProfilePicture{ image in
                self.placeHolderImage = Image(uiImage: image)
            }
        }

    }

}

Когда появляется ProfileView, это вызовет getProfilePicture. image, указанное в image in (при вызове функции) - это то, через что проходит обработчик завершения (completion(image)). Затем вы можете изменить placeHolderImage на то, что вы получите в getProfilePicture, но прежде чем сделать это, вам нужно превратить uiImage в Image. Также убедитесь, что вы добавили ключевое слово @State в свою переменную, чтобы при его изменении обновлялся View.

Надеюсь, это поможет!

...