【发布时间】:2021-07-29 23:21:48
【问题描述】:
当我在我的视图中调用它时,我无法让我的完成处理程序中的代码运行。我一直试图弄清楚为什么它不起作用但没有运气。我相信它与 DispatchQueue 有关,但我不确定。这是我试图运行的视图代码。如果有人能解释为什么代码没有运行,那将不胜感激
struct SignIn: View {
@Binding var userID: String
@Binding var passcode: String
@EnvironmentObject var authentication: AuthenticationCheck
var body: some View {
Button(action: {
// Note: Works once data is decoded
// Completion handler not running
print("Button action")
NetworkService.shared.signIn(username: userID, password: passcode) { (result) in
switch result {
case .success(let user):
// Does not run
print("This user last name is: \(userresult.login.userName)")
authentication.updateValidation(success: true)
case .failure(let error):
print("The error is: \(error.localizedDescription)")
}
}
}) {
Text("Sign In")
.multilineTextAlignment(.center)
.padding()
}
.frame(width: 150.0, height: 43.0)
.foregroundColor(.white)
.cornerRadius(20)
.disabled(userID.isEmpty || passcode.isEmpty)
}
}
这是我的网络调用的一些代码
func request<T: Codable>(endPoint: EndPoint, method: Method, parameters: [String: Any]? = nil, completion: @escaping(Result<T, Error>) -> Void) {
// Creates a urlRequest
guard let request = createRequest(endPoint: endPoint, method: method, parameters: parameters) else {
completion(.failure(AppError.invalidUrl))
return
}
let session = URLSession.shared
session.dataTask(with: request) { data, response, error in
var results: Result<Data, Error>?
guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
completion(.failure(AppError.badStatusCode))
return
}
if let response = response {
// Gets the JSESSIONID
let cookieName = "JSESSIONID"
if let cookie = HTTPCookieStorage.shared.cookies?.first(where: { $0.name == cookieName }) {
debugPrint("\(cookieName): \(cookie.value)")
}
print(response)
}
// Look into this
if let data = data {
results = .success(data)
} else if let error = error {
results = .failure(error)
print("Server Error: \(error.localizedDescription)")
}
DispatchQueue.main.async {
self.handleResponse(result: results, completion: completion)
}
}.resume()
}
private func handleResponse<T: Decodable>(result: Result<Data, Error>?, completion: (Result<T, Error>) -> Void) {
guard let result = result else {
completion(.failure(AppError.unknownError))
return
}
switch result {
case .success(let data):
let decoder = JSONDecoder()
// Decodes that json data
do {
let json = try decoder.decode(T.self, from: data)
completion(.success(json))
} catch {
print(error.localizedDescription)
}
case .failure(let error):
completion(.failure(error))
}
}
我正在使用这个函数来发出请求
func signIn(username: String, password: Any, completion: @escaping (Result<LoginResponseData.Root.Result.Login.UserName.Name, Error>) -> Void) {
let params = ["username": "\(username)", "password": "\(password)"]
request(endPoint: .Login, method: .post, parameters: params, completion: completion)
}
【问题讨论】:
-
强烈建议不要将异步内容放入视图的渲染区域。使用视图模型。