質問: list[i] } ``` ### 補足情報(FW/ツールのバージョンなど) Xcode 10 swift 4
回答: 正しく動いているのだとは思いますが、おそらく処理の間レインボーカーソルになっていると思います。 これはRunLoopが止まってしまっているからで、RunLoopが止まっている間は、イベント処理や描画が行われません。 RunLoopは大雑把に言うと 開始 ↓ イベント処理(システムイベントや、ユーザーアクションなど) ↓ 描画処理 ↓ Timer処理 ↓ その他の処理 ↓ 初めに戻る ということをしています。(実際の処理の順番は非公開のため不明) `@IBAction func Start(_ sender: Any)`ということはおそらくボタンクリックなどでこの関数が呼ばれるように設定していると思いますので、この関数はRunLoopのタスクでいうイベント処理部分で実行されています。 見てわかるとおり、イベント処理が終わらない限り、描画処理は行われません。 これを何とかしなければなりません。 その1(僕はあまりお勧めしません) RunLoopの中でRunLoopを回す ``` Label.stringValue = list[i] RunLoop.current.run(until: Date()) // 追加 ``` RunLoopの中でRunLoopを回すというと奇異に感じますが2重のforループのようにするということです。 また、終了時刻に現在の時刻を与えることで、ループが1度回っただけで処理が返ってきます。 その2 時間のかかる処理を別スレッドで行う ``` /// 暗号化 private func encrypt(_ completionHandler: () -> Void) { // // func Start(_ sender: Any)の中身だったもの // // ただしここ書き換え // Label.stringValue = list[i] // 描画にかかわりのある処理はメインスレッド上で実行しなければならない DispatchQueue.main.async { Label.stringValue = list[i] } // // // 追加 // 暗号化処理が終わったら与えられた関数を実行する completionHandler() } @IBAction func Start(_ sender: Any) { // ボタンのクリックなどでアクションが呼ばれると仮定して // 処理中はそれを無効化する let control = sender as? NSControl control?.isEnable = false // 別スレッドで暗号化 DispatchQueue.global().async { encrypt() { // 暗号化処理が終わったらこのクロージャが呼ばれる // 描画にかかわりのある処理はメインスレッド上で実行しなければならない DispatchQueue.main.async { // 有効に戻す control?.isEnable = true } } } } ```