Как использовать обработчик завершения, чтобы поместить изображение в представление SwiftUI

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

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, но не мог понять, как его использовать для решения проблемы. Спасибо!


person Eli Front    schedule 24.10.2019    source источник
comment
поставьте точку останова в строке, где у вас есть return image. Что это?   -  person Adrian    schedule 24.10.2019
comment
@ Адриан Что ты имеешь в виду?   -  person Eli Front    schedule 24.10.2019
comment
Взгляните на это: youtube.com/watch?v=mgspBMsWlS4. Тип. po image после того, как вы добавили точку останова и посмотрите, что это такое.   -  person Adrian    schedule 24.10.2019
comment
Также загляните в раздел struct ImageProvider: RequestImages в этом посте. medium.com/better-programming/   -  person Adrian    schedule 24.10.2019
comment
@Adrian Я получил такой результат: ‹UIImage: 0x280950510 anonymous {37.5, 37.5}›   -  person Eli Front    schedule 24.10.2019
comment
Круто ... так что вы получаете то, что вам нужно. Теперь просто напишите обработчик завершения. Ссылка, которую я разместил выше, должна привести вас туда. Ответ Кямрана должен помочь :)   -  person Adrian    schedule 24.10.2019
comment
@Adrian Итак, я понимаю обработчик завершения, но как мне его использовать в представлении swiftUI?   -  person Eli Front    schedule 24.10.2019
comment
Давайте продолжим это обсуждение в чате.   -  person Eli Front    schedule 24.10.2019
comment
Думаю, вам стоит принять ответ и задать другой вопрос. Вы расширили рамки своего исходного вопроса. TBQH, я не особо возился со SwiftUI, поэтому у меня нет авторитетного ответа.   -  person Adrian    schedule 24.10.2019


Ответы (2)


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

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 обновлялся.

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

person 39fredy    schedule 24.10.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)

            }
        }
    }
person Kamran    schedule 24.10.2019
comment
Я пробовал это раньше, но мне было трудно использовать результат завершения в представлении SwiftUI. - person Eli Front; 24.10.2019
comment
@EliFront Я не могу предоставить точное решение, так как до сих пор не использовал SwiftUI. Но я думаю, вам понадобится какая-то State переменная и привяжите к ней свой Image, а позже, когда вы получите UIImage в завершении, просто установите переменную State, чтобы ваш Image мог обновляться. Вы также можете проверить эту ссылку. - person Kamran; 24.10.2019
comment
Жаль, потому что я чувствую себя так близко. Мне просто нужно выяснить, как вызвать функцию из представления swiftUI, которое не возвращает представление - person Eli Front; 24.10.2019