【问题标题】:Passing server response to ViewModel MVVM将服务器响应传递给 ViewModel MVVM
【发布时间】:2022-01-01 22:02:14
【问题描述】:

我一直试图将我的 AF.request 语句的响应传递给我的 viewModel,但仍然无法理解?我需要将我的响应传递给我的 ViewModel,然后使用它在 tableView 中显示。

这是我的服务类:

服务

class Service {
    
  fileprivate var baseUrl = ""
    //https://api.themoviedb.org/3/tv/76479?api_key=3d0cda4466f269e793e9283f6ce0b75e&language=en-US
    init(baseUrl: String) {
        self.baseUrl = baseUrl
    }
    var tvShowDetails = TVShowModel()
    
    func getTVShowDeet(completionHandler: @escaping ()-> TVShowModel){
        let request = AF.request(self.baseUrl)
        .validate()
        .responseDecodable(of: TVShowModel.self) { (response) in
            guard let tvShow = response.value else {return}
            return tvShow
            print("printing response", tvShow)
        }
     }
}

视图模型

 func getTVShowDetails(){
    service.getTVShowDeet{
        print(self.response)
        self.delegate?.reloadTable()
        self.headerDelegate?.configureHeader()
        print("prinitn respinse in VM", self.response)
    }
 }

型号

struct TVShowModel : Decodable {    
    let id : Int?
    let original_name : String?
    let overview : String?

    enum CodingKeys: String, CodingKey {
        case id = "id"
        case original_name = "original_name"
        case overview = "overview"
    }

    init(){
        id = nil
        original_name = nil
        overview = nil    
    }
}

【问题讨论】:

    标签: swift mvvm server alamofire completionhandler


    【解决方案1】:

    网络请求是asynchronous,这意味着我们不知道它们何时会完成,因此我们需要使用完成处理程序而不是从函数返回(除非您使用 Async/Await)。类似这样的东西应该可以工作:


    服务

    func getTVShowDeet(completionHandler: @escaping (TVShowModel) -> Void) {
        let request = AF.request(self.baseUrl)
        .validate()
        .responseDecodable(of: TVShowModel.self) { (response) in
            guard let tvShow = response.value else { return }
            completionHandler(tvShow)
        }
     }
    

    视图模型

     func getTVShowDetails() {
        service.getTVShowDeet { [weak self] tvShow in
            
            // Here you may need to store the tvShow object somewhere to use in your tableView datasource.
    
            self?.delegate?.reloadTable()
            self?.headerDelegate?.configureHeader()
        }
     }
    

    【讨论】:

    • 非常感谢让我试试这个。
    • @FatimaAkram 根据 SO 指南,如果您认为合适,请将此标记为答案,谢谢! stackoverflow.com/help/someone-answers
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多