SwiftUI Observable Object, возвращающий устаревшие данные - PullRequest
0 голосов
/ 04 мая 2020

Так что я довольно новичок в SwiftUI и возиться с API входа в систему с Flask. Я использую ObservableObject, поскольку BindableObject устарел.

class Auth: ObservableObject {
    let objectWillChange = ObservableObjectPublisher()

    var authenticated = false {
        willSet{
            objectWillChange.send()
        }
    }

    func verify(username : String, password : String){

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

        let bodyFormat : [String:String] = ["Username":username,"Password":password]
        let body = try! JSONSerialization.data(withJSONObject: bodyFormat)

        var request = URLRequest(url:url)
        request.httpMethod = "POST"
        request.httpBody = body

        request.setValue("application/json", forHTTPHeaderField: "Content-Type")

        URLSession.shared.dataTask(with: request) {
            (data,response,error) in
            guard let data = data else {return}

            let decodedData = try! JSONDecoder().decode(UserLoginData.self, from: data)

            print(decodedData.Status)
            if(decodedData.Status == "Success"){
                DispatchQueue.main.async {
                    self.authenticated = true
                }
            }
            else{
                DispatchQueue.main.async {
                    self.authenticated = false
                }
            }
        }.resume()
    }
}

В главном представлении у меня есть

@ObservedObject var authenticator = Auth()
self.authenticator.verify(username: self.username, password: self.password)
print(authenticator.authenticated) 

Я печатаю его, чтобы проверить значение. Теперь проблема в том, что сервер вернет ответ «Успех», но когда я сделаю print(authenticator.authenticated), он напечатает более старые данные. Когда я дважды нажимаю кнопку «Вход», она работает так же, как и предыдущие назначенные данные.

Спасибо за любую помощь !!

РЕДАКТИРОВАТЬ: Одна вещь, которую я заметил, заключается в том, что * Строка 1012 * вызывается перед строкой authenticator.authenticated и, таким образом, возвращает последнее значение, которое было установлено.

1 Ответ

0 голосов
/ 04 мая 2020

просто переместите вашу печать сюда:

print(decodedData.Status)
        if(decodedData.Status == "Success"){
            DispatchQueue.main.async {
                self.authenticated = true
//-> print here
            }
        }
        else{
            DispatchQueue.main.async {
                self.authenticated = false
//-> print here

            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...