Как я могу использовать asyn c закрытие вызова для инициализации параметра под SwiftUI - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь инициализировать значение в методе init (), но я получаю эту ошибку Экранирующее закрытие захватывает изменяющийся параметр 'self'

Это работает, если я помещаю его в onAppear () но он не будет звонить, если экран находится в задней группе, так что это не то, что мне было нужно. Прикрепил мою кодировку ..

struct GameRowForDemo: View {

    let game : Game
    var user : User?


    init(game:Game){
        self.game = game
        let uid = "123"
        User.getById(id: uid).then { user in
            self.user = user!
        }
    }




    var body: some View {
        Text("Text")
    }
}

static func getById(id: String) -> Promise<User?>  {
    let p = Promise<User?> { (resolve , reject) in
        let db = Firestore.firestore()
        let ref = db.collection("users").document(id)
        ref.getDocument { (snapshot, err) in
            if let err = err{
                reject(err)
            }
            guard let dict = snapshot?.data() else {
                print("No User found")
                resolve(nil)
                return
            }
            do {
                let data = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
                let group = try JSONDecoder.init().decode(User.self, from: data)
                resolve(group)
            }catch{
                reject(error)
            }
        }
    }
    return p
}

1 Ответ

0 голосов
/ 04 марта 2020

Поскольку представление здесь не является мутирующим, я бы осуществил рефакторинг предоставленного кода, разложив связанные вещи в явную модель представления, как показано ниже

import Combine

class GameViewModel: ObservableObject {
    @Published var game : Game
    @Published var user : User?

    init(game: Game) {
        self.game = game
    }

    func fetchUser(uid: String) {
        User.getById(id: uid).then {[weak self] user in
            DispatchQueue.main.async {
                self?.user = user!
            }
        }
    }
}

struct GameRowForDemo: View {
    @ObservedObject var viewModel: GameViewModel

    init(viewModel: GameViewModel) {
        self.viewModel = viewModel
        viewModel.fetchUser(uid: "123")
    }

    var body: some View {
        Text("Text")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...