【问题标题】:Swift - Completion handler code not runningSwift - 完成处理程序代码未运行
【发布时间】: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)
    }
    

【问题讨论】:

  • 强烈建议不要将异步内容放入视图的渲染区域。使用视图模型。

标签: swift generics swiftui


【解决方案1】:

通常当您的转义闭包没有被调用时,这通常意味着您忘记在相关函数中调用它。查看您的代码,我认为您需要在case .success 中完成:

  case .success(let data):
            
            let decoder = JSONDecoder()
            // Decodes that json data
            do {
                let json = try decoder.decode(LoginResponseData.Root.self, from: data)
                // This prints
                print(json.result.login.userName.name.firstName)
            } catch {
                print(error.localizedDescription)
                
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多