Swift, как получить response.statuscode в представлении swiftui - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь вставить в базу данных использовать метод post в swift, и я не могу получить response.statusCode метода post в представлении swiftui, как я могу это исправить. переменная self.resp должна быть 201 в поле зрения, когда я вставлю успешно, но это было 0.

import SwiftUI

struct ContentView: View {
  @State var resp:Int  = 0
    var body: some View {
        VStack{
        Text("Hello, World!")
        Button(action: {
            self.resp = postAdd()
            print("view\(self.resp)")
        }) {
            Text(/*@START_MENU_TOKEN@*/"Button"/*@END_MENU_TOKEN@*/)
              
                
                .background(self.resp == 201 ? Color.green : Color.gray)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
func postAdd() ->Int{
            let url = URL(string: "http://localhost:3000/user")
            var request = URLRequest(url: url!)
    var resp = 0
                       request.httpMethod = "POST"
                        let urlstr = "id=5&name=aaa"
    
            request.httpBody = urlstr.data(using: .utf8)!
            let session = URLSession.shared
            session.dataTask(with: request) { (data, response, error) in
                if error == nil, let data = data, let response = response as? HTTPURLResponse {
                                   print("Content-Type: \(response.allHeaderFields["Content-Type"] ?? "")")
                                      print("statusCode: \(response.statusCode)")
                    resp = response.statusCode
                    print(String(data: data, encoding: .utf8) ?? "")
                }
            }.resume()
    return resp
        }

1 Ответ

0 голосов
/ 16 февраля 2020

попробуйте это:

, как я написал в комментарии - вы должны знать, какие вызовы asyn c, а какие syn c. Я надеюсь, что вы знаете, что такое syn c и asyn c звонки - если нет, пожалуйста, Google для этого. если да: вызов задачи data имеет тип asyn c и поэтому возвращает значение resp = 0. Через некоторое время, когда urlrequest готов, он продолжает в этой строке: «{(data, response, error) in», но здесь он больше не может возвращать значение, потому что метод уже вернул значение. Таким образом, с шаблоном завершения вы можете быть уверены, что вам позвонят, когда вызов asyn c будет готов.

struct ContentView: View {
    @State var resp:Int  = 0
    var body: some View {
        VStack{
            Text("Hello, World!")
            Button(action: {
                postAdd() { response in
                    self.resp = response

                    print("view\(self.resp)")
                }
            }) {
                Text(/*@START_MENU_TOKEN@*/"Button"/*@END_MENU_TOKEN@*/)
                    .background(self.resp == 201 ? Color.green : Color.gray)
            }
        }
    }
}


func postAdd(completion:@escaping(Int)->()) {
    let url = URL(string: "http://localhost:3000/user")
    var request = URLRequest(url: url!)
    request.httpMethod = "POST"
    let urlstr = "id=5&name=aaa"

    request.httpBody = urlstr.data(using: .utf8)!
    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in
        if error == nil, let data = data, let response = response as? HTTPURLResponse {
            print("Content-Type: \(response.allHeaderFields["Content-Type"] ?? "")")
            print("statusCode: \(response.statusCode)")
            completion(response.statusCode)
            print(String(data: data, encoding: .utf8) ?? "")
        } else {
            completion(404)
        }
    }.resume()

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