将响应作为 completionHandler 返回

时间:2021-06-26 20:09:34

标签: ios swift completionhandler

我正在编写一个服务类,它将从网络层获取数据并将其传递给 ViewModel。我使用完成处理程序从网络层传递数据。现在我不确定如何将这些数据从网络层传递到我的视图模型。以下是我在服务层的代码:

    class HomeService {
        
        func getStates() -> [State]? {
            let urlString = baseURL + statesURL
            let params = ["user_id": UserDetails.getUserID() as AnyObject]
            
            NetworkOperations.fetchPostResponse(url: urlString, param: params, completionHandler: { (result) in
                switch(result) {
                case .Success(let res):
                    guard let response = res as? [String: AnyObject] else {
                        return
                    }
                    if let status = response["status"] as? Bool,
                       status,
                       let content = response["content"] as? [[String: AnyObject]] {
                        let array = content.map({ State(json: $0) })
                        return array
//error here: Unexpected non-void return value in void function
                    }
                    break
                case .Failure(_):
                    break
                }
            })
//error here: Missing return in a function expected to return '[State]?'
        }
    }

我已经尝试了以上但出现错误:

<块引用>

预期返回“[State]?”的函数中缺少返回值

在我尝试返回数组的处理程序中,我收到以下错误:

<块引用>

void 函数中出现意外的非 void 返回值

1 个答案:

答案 0 :(得分:0)

您的函数 getStates() 是异步的。它不能返回值。就像 NetworkOperations.fetchPostResponse() 函数采用完成处理程序一样,您的 getStates() 函数需要采用完成处理程序。像这样:


func getStates(completion: StatesCompletion){
   //Your code to make the network call goes here
    case .Success(let res):
                    guard let response = res as? [String: AnyObject] else {
                    let error = MyError(statusInfo
                    completion(nil, error)
                    return
                    }
                    if let status = response["status"] as? Bool,
                       status,
                       let content = response["content"] as? [[String: AnyObject]] {
                        let array = content.map({ State(json: $0) })
                        completion(array, nil)
                      {
                    }
//...

有关该主题的更多信息,请参阅 this article that I googled