質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

808閲覧

SwiftでAPIを通してデータベースから引っ張り出してきたデータをTableViewで表示させたいです。

mokimokio

総合スコア53

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/09/23 10:58

編集2021/09/26 00:37

前提・実現したいこと

swiftでphpに日付データを送信し、phpからAZURE DBに接続。swiftで入力した日付データの範囲のDB情報を引っ張り出してphpを経由し、アプリ画面のTableViewにリスト表示させたいと考えているのですが、うまくいきません。ご指導お願いしたいです。

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

UITableView.reloadData() must be used from main thread only (翻訳)UITableView.reloadData()はメインスレッドからのみ使用する必要があります

翻訳しているのでエラーの内容はわかるのですが解決策がわかりません。。。

該当のソースコード

swift

1 2import UIKit 3import SystemConfiguration 4 5class kirokuhyouziViewController: UIViewController,UITableViewDataSource { 6 7 @IBOutlet weak var yearText1: UITextField! 8 @IBOutlet weak var monthText1: UITextField! 9 @IBOutlet weak var yearText: UITextField! 10 @IBOutlet weak var monthText: UITextField! 11 @IBOutlet weak var NV: UILabel! 12 @IBOutlet weak var TableView: UITableView! 13 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 yearText1.placeholder = "例)2021" 19 monthText1.placeholder = "例)8" 20 yearText.placeholder = "例)2021" 21 monthText.placeholder = "例)9" 22 23 TableView.dataSource = self 24 } 25 26 var okashiList : [(name:String, maker:String, link:URL, image:URL)] = [] 27 28 29 30 @IBAction func kirokuBtn(_ sender: Any) { 31 32 let YT1: String! = yearText1.text 33 let MT1: String! = monthText1.text 34 let YT2: String! = yearText.text 35 let MT2: String! = monthText.text 36 let btnCode = "3" 37 38 39 print(CheckReachability(host_name: "https://www.google.com/")) 40 //下記デバイスのオンラインオフラインを判定 41 let aaa:String = String(CheckReachability(host_name: "https://www.google.com/")) 42 43 if (aaa == "false") { 44 NV.text = "ネットワークに接続できていません。" 45 } else if (aaa == "true") { 46 //⬇︎オンライン時の処理⬇︎ 47 48 //⬇︎DBに送信する時間の処理⬇︎ 49 let dt = Date() 50 let formatter = ISO8601DateFormatter() 51 formatter.timeZone = TimeZone(identifier: "Asia/Tokyo") 52 let strDate = formatter.string(from: Date()) 53 print(strDate) 54 let timeDate = formatter.string(from: dt) 55 //⬆︎DBに送信する時間の処理⬆︎ 56 57 //⬇︎PHPに送信してデータベースへ送る⬇︎ 58 let url = URL(string: "https://") 59 var request = URLRequest(url: url!) 60 // POSTを指定 61 request.httpMethod = "POST" 62 63 let nyuryokuData = YT1 + MT1 + YT2 + MT2 64 65 66 //テキストフィールドからキーと値を連結してpostパラメータを生成する 67 let postParameters = "code="+btnCode+"name="+namee+"&pass="+nyuryokuData; 68 69 70 71 //ボディをリクエストするためのパラメータを追加する 72 request.httpBody = postParameters.data(using: String.Encoding.utf8) 73 let session = URLSession.shared 74 session.dataTask(with: request) { (data, response, error) in 75 if error == nil, let data = data, let response = response as? HTTPURLResponse { 76 // HTTPヘッダの取得 77 print("Content-Type: (response.allHeaderFields["Content-Type"] ?? "")") 78 // HTTPステータスコード 79 print("statusCode: (response.statusCode)") 80 print(String(data: data, encoding: .utf8) ?? "") 81 82 83 session.finishTasksAndInvalidate() 84 let decoder = JSONDecoder() 85 do { 86 let json = try decoder.decode(ResultJson.self, from: data) 87 88// リストを初期化 89 self.okashiList.removeAll() 90 91 if let items = json.item { 92 for item in items { 93 if let name = item.name, let maker = item.maker, let link = item.url, let image = item.image { 94 let okashi = (name,maker,link,image) 95 self.okashiList.append(okashi) 96 } 97 } 98// TableViewを更新する 99self.TableView.reloadData() 100 101 if let okashidbg = self.okashiList.first { 102 print("----------------------") 103 print("okashiList[0] = (okashidbg)") 104 } 105 } 106 107 108 } catch { 109 print("ERROR: (error)") 110 } 111 112 } 113 //開始する 114 }.resume() 115 //⬆︎PHPに送信してデータベースへ送る⬆︎ 116 117 118 119 //⬆︎オンライン時の処理⬆︎ 120 } 121 122 } 123 124 struct ItemJson: Codable { 125 let name: String? 126 let maker: String? 127 let url: URL? 128 let image: URL? 129 } 130 struct ResultJson: Codable { 131 let item:[ItemJson]? 132 } 133 134 //ここからオフラインの判定関数 135 func CheckReachability(host_name:String)->Bool{ 136 137 let reachability = SCNetworkReachabilityCreateWithName(nil, host_name)! 138 var flags = SCNetworkReachabilityFlags.connectionAutomatic 139 if !SCNetworkReachabilityGetFlags(reachability, &flags) { 140 return false 141 } 142 let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0 143 let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0 144 return (isReachable && !needsConnection) 145 } 146 //ここまでオフラインの判定関数 147 148 149 150 // Cellの総数を呼び出すdataSourceメソッド、必ず記述する必要がある。 151 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 152 // お菓子リストの総数 153 return okashiList.count 154 } 155 156 // Cellに値を設定するdataSourceメソッド。必ず記述する必要がある。 157 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 158 // 今回表示を行う、Cellオブジェクト(一行)を取得する 159 let cell = tableView.dequeueReusableCell(withIdentifier: "okashiCell", for: indexPath) 160 // お菓子タイトル設定 161 cell.textLabel?.text = okashiList[indexPath.row].name 162 163 if let imageData = try? Data(contentsOf: okashiList[indexPath.row].image) { 164 // 正常に取得できた場合は、UIImageで画像オブジェクトを生成して、Cellにお菓子画像を設定 165 cell.imageView?.image = UIImage(data: imageData) 166 } 167 168 // 設定ずみのCellオブジェクトを画像に反映 169 return cell 170 } 171} 172

❌をつけた場所がエラー箇所です。

試したこと

知識不足だと思い非同期処理について調べたり、参考書を購入してTableViewの基礎を身につけて行ったのですがやはりここが解決できなかった現状です。

補足情報(FW/ツールのバージョンなど)

xcode phpはvscode データベースはAZUREを使用しています。 Mac O Sです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/09/23 13:03

session.dataTask の completion handler はバックグラウンドスレッドで実行されるので、DispatchQueue.main.async { 〜 } とかを使ってメインスレッドで動かす必要があるかと。
mokimokio

2021/09/26 00:18

まさしくそうでした!ありがとうございます!無事解決してtableViewに表示させる事ができました!助かりました????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問