SwiftのViewMode側でテーブルビューをリロードしたい

実現したいこと

MVVMのViewModel側でテーブルビューをリロードしたいです。

前提

MVVMで最小のAPIアプリを作っています。
Model:構造体などの情報
ViewModel:Modelを使ってデータを取得したり、Functionをまとめたり
View:画面に関する処理のみ記述

発生している問題・エラーメッセージ

Value of type 'TableViewReloadVieModel' has no member 'reload'

該当のソースコード

Swift

1// TableViewReloadVieModel.swift2import Alamofire3import Foundation4 5 6// プロトコル7protocol TableViewReloadViewModelOutput{8 // テーブルビューをリロードするメソッド9 func reload()10}11 12class TableViewReloadVieModel {13 14 // 変数15 // テーブルビュー表示用16 var display_qiita_article: [ArticleInfo] = []17 18 // APIエンドポイント19 let apiUrlString = "https://qiita.com/api/v2/items"20 21 22 // MARK: - Function23 func fetchQiitaArticles () {24 25 // URLオブジェクトを生成26 if let apiUrl = URL(string: apiUrlString) {27 // URLセッションを作成28 let session = URLSession.shared 29 30 // データタスクを作成してGETリクエストを送信31 let task = session.dataTask(with: apiUrl) { data, response, error in32 if let error = error {33 print("Error: \(error)")34 } else if let data = data {35 do {36 // 取得したデータをJSONオブジェクトにパース37 if let jsonArray = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] {38 // JSONデータを利用する39 for json in jsonArray {40 if let title = json["title"] as? String {41 print("Title: \(title)")42 }43 if let user = json["user"] as? [String: Any], let id = user["id"] as? String {44 print("====================================")45 print("ユーザーIDは")46 print("User ID: \(id)")47 print("====================================")48 }49 // リロードする50 self.reload()51 }52 }53 } catch {54 print("Error: \(error)")55 }56 }57 }58 59 // データタスクを開始60 task.resume()61 }62 }63}64

Swift

1// TableViewReloadViewController.swift2import UIKit3 4class TableViewReloadViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, TableViewReloadViewModelOutput {5 6 // 接続7 @IBOutlet var tableView: UITableView!8 9 // インスタンス10 let viewModel = TableViewReloadVieModel()11 12 override func viewDidLoad() {13 super.viewDidLoad()14 15 // データを取得する16 viewModel.fetchQiitaArticles()17 18 // デリゲート19 tableView.dataSource = self20 21 // カスタムセル登録22 self.initTableView()23 }24 25 // MARK: - TableView26 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {27 return viewModel.display_qiita_article.count28 }29 30 31 // 中身32 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {33 34 let cell = tableView.dequeueReusableCell(withIdentifier: "QiitaArticleTableViewCell", for: indexPath) as! QiitaArticleTableViewCell35 36 // 記事タイトル37 cell.title.text = viewModel.display_qiita_article[indexPath.row].title 38 // 記事URL39 cell.url.text = viewModel.display_qiita_article[indexPath.row].url 40 41 return cell 42 }43 44 45 // セルの高さ46 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {47 return 6448 }49 50 51 // 選択時52 func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {53 54 print("=====================")55 print("セルタップしたよ")56 print("=====================")57 print("セル番号は")58 print(String(indexPath.row))59 print("=====================")60 }61 62 63 // MARK: - Action64 65 @IBAction func addButton(_ sender: Any) {66 67 }68 69 70 // MARK: - Function71 private func initTableView() {72 tableView.register(UINib(nibName: "QiitaArticleTableViewCell", bundle: nil), forCellReuseIdentifier: "QiitaArticleTableViewCell")73 }74 75 func reload() {76 // メインスレッドで読み込む77 DispatchQueue.main.async {78 self.tableView.reloadData()79 }80 }81}82 83

試したこと

色々試したのですがViewModel側でリロード出来ませんでした。
MVVM初めてなのでお手柔らかにお願いいたします。

コメントを投稿

0 コメント