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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Swift Playground

Swift Playgroundは、Swiftをインタラクティブに習得できるiPad向けのアプリケーション。コーディングの知識は一切必要なく、Swift Playgrounds上でプログラミングしたコードによりドローン・ロボットを自在に動かすことが可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Swift

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

Q&A

解決済

1回答

1237閲覧

iOSアプリのhttp通信で出るエラーの改善のお願い

ousama

総合スコア3

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Swift Playground

Swift Playgroundは、Swiftをインタラクティブに習得できるiPad向けのアプリケーション。コーディングの知識は一切必要なく、Swift Playgrounds上でプログラミングしたコードによりドローン・ロボットを自在に動かすことが可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Swift

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

0グッド

0クリップ

投稿2020/06/18 18:12

編集2020/06/18 18:13

swiftでiOSアプリを作成しています。

取得したセンサのデータをPCに送信し、解析結果をPCに送信しています。
ですが、このようなものが出てきます。
なにか改善点があればご教授ください。

出たエラー UILabel.text must be used from main thread only viewContoroller.swiftの部分に出ます。 if self.kantou=="1"{ self.resultLabel.text="少しあります。" }else if self.kantou=="2"{ self.resultLabel.text="大丈夫です。" }else if self.kantou=="3"{ self.resultLabel.text="なにも異常ないです。" } }

ViewContoroller.swift

1// 2// ViewController.swift 3 4 5 6import UIKit 7import CoreMotion 8import simd 9 10class ViewController: UIViewController { 11 12 13 14 @IBOutlet weak var label: UILabel! 15 // ボタンの定義 16 var acc_x:String="" 17 var acc_y:String="" 18 var acc_z:String="" 19 20 var gra_x:String="" 21 var gra_y:String="" 22 var gra_z:String="" 23 24 var gyro_x:String="" 25 var gyro_y:String="" 26 var gyro_z:String="" 27 28 var atti_roll:String="" 29 var atti_pitch:String="" 30 var atti_yaw:String="" 31 32 var quat_x:String="" 33 var quat_y:String="" 34 var quat_z:String="" 35 var quat_w:String="" 36 37 var kantou:String="" 38 @IBOutlet weak var resultLabel: UILabel! 39 40 //サンプリングレート 41 var deviceMotionUpdateInterval = 0 42 43 44 //答えのテキスト 45// var resultText:String = "" 46 47 //日にち取得 48 let format = DateFormatter() 49 50 private(set) var isRecording = false 51 52 //記録するテキスト 53 private var recordText = "" 54 55 let motionManager: CMMotionManager = CMMotionManager() 56 57 58 override func viewDidLoad() { 59 super.viewDidLoad() 60 _=OperationQueue() 61 } 62 override func didReceiveMemoryWarning() { 63 super.didReceiveMemoryWarning() 64 } 65 66 67 68 69 //スタートボタンで計測中 70 @IBAction func tap_Start(_ sender: Any) { 71 motionManager.deviceMotionUpdateInterval = 0.016666666 // 60Hz サンプリングレート 72 recordText = "" 73 // recordText += headerText + "\n" 74 isRecording = true 75 76 //取得に移動 77 getMotionDate() 78 79 label.text = "計測中" 80 view.backgroundColor = UIColor.red 81 } 82 83 //ストップボタンで計測ストップ 84 @IBAction func tap_Stop(_ sender: Any) { 85 if motionManager.isDeviceMotionAvailable{ 86 motionManager.stopDeviceMotionUpdates() 87 } 88 89 isRecording = false 90 91 format.dateFormat = "yyyy-MMdd-HHmmss" //時間の取得 92 let dateText = format.string(from: Date()) 93 showSaveCsvFileAlert(fileName: dateText) 94 95 label.text = " " 96 view.backgroundColor = UIColor.white 97 } 98 99 //モーションセンサの取得 100 func getMotionDate(){ 101 if motionManager.isDeviceMotionAvailable{ 102 motionManager.startDeviceMotionUpdates(to:OperationQueue.current!, withHandler:{deviceManager, error in 103 let accel: CMAcceleration = deviceManager!.userAcceleration 104 self.acc_x = String(format: "%.2f", accel.x) 105 self.acc_y = String(format: "%.2f", accel.y) 106 self.acc_z = String(format: "%.2f", accel.z) 107 108 let gravity: CMAcceleration = deviceManager!.gravity 109 self.gra_x = String(format: "%.2f", gravity.x) 110 self.gra_y = String(format: "%.2f", gravity.y) 111 self.gra_z = String(format: "%.2f", gravity.z) 112 113 let gyro: CMRotationRate = deviceManager!.rotationRate 114 self.gyro_x = String(format: "%.2f", gyro.x) 115 self.gyro_y = String(format: "%.2f", gyro.y) 116 self.gyro_z = String(format: "%.2f", gyro.z) 117 118 let attitude: CMAttitude = deviceManager!.attitude 119 self.atti_roll = String(format: "%.2f", attitude.roll) 120 self.atti_pitch = String(format: "%.2f", attitude.pitch) 121 self.atti_yaw = String(format: "%.2f", attitude.yaw) 122 123 let quaternion: CMQuaternion = attitude.quaternion 124 self.quat_x = String(format: "%.2f", quaternion.x) 125 self.quat_y = String(format: "%.2f", quaternion.y) 126 self.quat_z = String(format: "%.2f", quaternion.z) 127 self.quat_w = String(format: "%.2f", quaternion.w) 128 129 130 if self.isRecording { 131 self.format.dateFormat = "MMddHHmmssSSS" 132 133 var text = "" 134 135 text += String(accel.x) + "," 136 text += String(accel.y) + "," 137 text += String(accel.z) + "," 138 text += String(gravity.x) + "," 139 text += String(gravity.y) + "," 140 text += String(gravity.z) + "," 141 text += String(gyro.x) + "," 142 text += String(gyro.y) + "," 143 text += String(gyro.z) + "," 144 text += String(quaternion.x) + "," 145 text += String(quaternion.y) + "," 146 text += String(quaternion.z) + "," 147 text += String(quaternion.w) 148 149 self.addRecordText(addText: text) 150 151 } 152 }) 153 } 154 } 155 156 func addRecordText(addText:String) { 157 recordText += addText + "\n" 158 } 159 160 161 func showSaveCsvFileAlert(fileName:String){ 162 163 let alertController = UIAlertController(title: "CSVデータを保存しまし", message: "名前を入力してください", preferredStyle: .alert) //ファイル名の入力するアラートの 164 165 let defaultAction:UIAlertAction = 166 UIAlertAction(title: "はい", 167 style: .default, 168 handler:{ 169 (action:UIAlertAction!) -> Void in 170 171 //テキストフィールドに入力したものを格納 172 let textField = alertController.textFields![0] as UITextField 173 self.saveSensorDataToCsv(fileName: textField.text!) 174 175 176 self.tuusin() 177 }) 178 179 let cancelAction:UIAlertAction = 180 UIAlertAction(title: "いいえ", 181 style: .cancel, 182 handler:{ 183 (action:UIAlertAction!) -> Void in 184 self.showDeleteRecordedDataAlert(fileName: fileName) 185 }) 186 187 alertController.addTextField { (textField:UITextField!) -> Void in 188 alertController.textFields![0].text = fileName 189 } 190 alertController.addAction(defaultAction) 191 alertController.addAction(cancelAction) 192 193 present(alertController, animated: true, completion: nil) 194 } 195 196 197 //取得したデータを削除するorしないのアラートを出力 198 func showDeleteRecordedDataAlert(fileName:String){ 199 let alertController = UIAlertController(title: "記録したデータを削除します", message: "削除してよろしいですか?", preferredStyle: .alert) 200 201 let defaultAction:UIAlertAction = 202 UIAlertAction(title: "はい", 203 style: .default, 204 handler:{ 205 (action:UIAlertAction!) -> Void in 206 // delete recorded data 207 }) 208 let cancelAction:UIAlertAction = 209 UIAlertAction(title: "いいえ", 210 style: .cancel, 211 handler:{ 212 (action:UIAlertAction!) -> Void in 213 self.showSaveCsvFileAlert(fileName: fileName) 214 }) 215 alertController.addAction(defaultAction) 216 alertController.addAction(cancelAction) 217 218 present(alertController, animated: true, completion: nil) 219 } 220 221 222 //csvデータの保存 223 func saveSensorDataToCsv(fileName:String) { 224 let filePath = NSHomeDirectory() + "/Documents/" + fileName + ".csv" 225 226 do{ 227 try recordText.write(toFile: filePath, atomically: false, encoding: String.Encoding.utf8) 228// print("Success to Write CSV") 229// print(filePath) 230 231 }catch let error as NSError{ 232 print("Failure to Write CSV\n(error)") 233 } 234 } 235 236 237 238 func tuusin(){ 239 240 let url = URL(string: "http://○○○○○○○○:8000") 241 var request = URLRequest(url: url!) 242 // POSTを指定 243 request.httpMethod = "POST" 244 // POSTするデータをBodyとして設定 245 246 247 request.httpBody = recordText.data(using: .utf8) 248 let session = URLSession.shared 249 session.dataTask(with: request) { (data, response, error) in 250 if error == nil, let data = data, let response = response as? HTTPURLResponse { 251 // HTTPヘッダの取得 252 print("Content-Type: (response.allHeaderFields["Content-Type"] ?? "")") 253 // HTTPステータスコード 254 print("statusCode: (response.statusCode)") 255 256 self.kantou=String(data: data, encoding: .utf8) ?? "" 257 print(self.kantou) 258 259 if self.kantou=="1"{ 260 self.resultLabel.text="少しあります。" 261 262 }else if self.kantou=="2"{ 263 self.resultLabel.text="大丈夫です。" 264 265 }else if self.kantou=="3"{ 266 self.resultLabel.text="なにも異常ないです。" 267 268 } 269 270 } 271 }.resume() 272 } 273 274}

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

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

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

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

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

guest

回答1

0

ベストアンサー

URLSession セッションの結果が返ってくると completionHandler (session.dataTask(with: request) の後ろの { (data, response, error) in で始まるブロック) はバックグラウンドスレッドで呼ばれますが、UI の更新はメインスレッドで行う必要があるので、DispatchQueue.main.async { 〜 } を使ってメインスレッドで処理する必要があります。
参考: UIの更新はmain threadから行う - code.alone (← sync を使ってますが、async でいいはず。)
参考: 【Swift】URLSessionまとめ - Qiita

swift

1 let session = URLSession.shared 2 session.dataTask(with: request) { (data, response, error) in 3 if error == nil, let data = data, let response = response as? HTTPURLResponse { 4 // HTTPヘッダの取得 5 print("Content-Type: (response.allHeaderFields["Content-Type"] ?? "")") 6 // HTTPステータスコード 7 print("statusCode: (response.statusCode)") 8 9 self.kantou=String(data: data, encoding: .utf8) ?? "" 10 print(self.kantou) 11 12 // UI の更新はメインスレッドで行う。 13 DispatchQueue.main.async { 14 if self.kantou=="1"{ 15 self.resultLabel.text="少しあります。" 16 17 }else if self.kantou=="2"{ 18 self.resultLabel.text="大丈夫です。" 19 20 }else if self.kantou=="3"{ 21 self.resultLabel.text="なにも異常ないです。" 22 23 } 24 } 25 26 } 27 }.resume()

投稿2020/06/18 20:25

hoshi-takanori

総合スコア7895

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

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

ousama

2020/06/19 02:43

ご回答ありがとうございました。 改善することができました。参考するサイトもつけていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問