将服务器响应传递给 ViewModel MVVM

Passing server response to ViewModel MVVM

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

这是我的服务Class:

Service

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)
        }
     }
}

ViewModel

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

Model

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    
    }
}

网络请求是 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()
    }
 }