前提・実現したいこと
codableを使用して取得したjsonデータをTextViewに表示する
■機能の詳細
顧客の一覧をTableViewに表示し、それがタップされたら登録情報を出力したjsonを作成&読込を行い、横のTextViewに顧客データの詳細が表示されるという画面を作成しています。顧客データは編集が可能とし、更新ボタンが押されるとサーバーのデータが更新され、その際に顧客一覧のjsonデータも再作成される仕組みです。
そのjsonデータは更新処理の度にしっかり新しいものが再作成されているのですが、jsonデータを取得しに行っているところでCodableの構造体に新しいjsonデータが取り込まれてきません。(アプリ初回立ち上げ時のデータを保持し続けている状態のように見えます。)
アプリを一度削除して、再度起動することでサーバーにある新しいjsonを取得してくるようですが、どこを修正すればTableViewのセルをタップする度に新しいjsonを取得してくれるようになるのか、ぜひご教授頂きたく投稿させて頂きました。
json 新規登録&更新でidに紐づくデータが増えていく
・customertbl.json
[
{"id": "400001","ymd": "20190626","text": "テストテストテスト"},
{"id": "400002","ymd": "20190626","text": "テストテストテストテストテストテスト"}
]
swift
1import UIKit 2 3 struct CustomerTbl: Codable { 4 var id: String 5 var ymd: String 6 var text: String? // nullの場合がある or キーがない場合がある 7 } 8 9 // 選択したセルの値を出力する。 10 func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath) { 11 12 // json出力 13 selectDB() 14 // json読み込み&TextView出力 15 displayCaseData(selectedUserId: USER_ID) 16 17} 18 // 作成されたjsonデータを表示する 19 func displayCaseData(selectedUserId:String){ 20 let UpdaterID = UPDATER_ID 21 let urlStr = "https://XXXXXX.com/customertbl.json" 22 let url = URL(string: urlStr)! 23 let task = URLSession.shared.dataTask(with: url) { data, response, error in 24 25 // クライアントサイドのエラー(ホストに接続できないなど) 26 if let error = error { 27 print("クライアントエラー: (error.localizedDescription) \n") 28 return 29 } 30 31 guard let data = data, let response = response as? HTTPURLResponse else { 32 print("no data or no response") 33 return 34 } 35 36 if response.statusCode == 200 { 37 let json: [CustomerTbl] = try! JSONDecoder().decode([CustomerTbl].self, from: data) 38 39 print("The json dictionary contains (json.count) items.") 40 print(selectedUserId) 41 Array(0..<json.count).forEach { 42 print("loop内(json[$0].id)") 43 if json[$0].id == selectedUserId{ 44 self.setJsonDataToTextField(jsonText:json[$0].text ?? "") 45 } 46 } 47 } else { 48 // レスポンスのステータスコードが200でない場合などはサーバサイドエラー 49 print("サーバエラー ステータスコード: (response.statusCode)\n") 50 } 51 52 } 53 task.resume() 54 55 56 } 57 func setJsonDataToTextField(jsonText: String){ 58 DispatchQueue.main.async { 59 self.casetextTextView.text = jsonText 60 } 61 }
試したこと
codableの構造体の初期化や、URLセッションの設定が間違っているのではないかと色々試しているのですが、完全にお手上げ状態です。。
回答1件
あなたの回答
tips
プレビュー