[解決済み] これを解決するにはどうしたらいいのでしょうか。UILabel.textは、メインスレッドからのみ使用する必要があります。
2022-02-12 02:29:32
質問
そこで、私のアプリケーションのUIを更新しようとしています。ラベルは更新されるのですが、その際に自分の値を保持せず、他のラベルの値を取得することがあります。 また、ラベルはメインスレッドからのみ使用されるべきであるというメッセージが表示されますが、これを解決するにはどうすればよいですか?
以下は私のコードです。
let queue = DispatchQueue(label: "update")
queue.async {
for s in self.fietshare.stands {
for b in s.bikes {
lbAvailable.text = "Available Bikes: " + String(s.id) + " " + String( s.bikes.count) // shows too big numbers
nrOfAvailable.text = String(b.distance) + "M"
annotationView.layoutIfNeeded()
print(s.id)
print("Nr of bikes")
print(s.bikes.count)
}
}
}
DispatchQueue.main.async {
self.view.backgroundColor = . black;
self.view.layoutIfNeeded()
}
if (Thread.current.isMainThread) {
print("Main thread")
}
解決方法は?
これを試してみてください
let queue = DispatchQueue(label: "update")
queue.async {
var available = ""
var nrOfAvailable = ""
for s in self.fietshare.stands{
for b in s.bikes {
available = available + "Available Bikes: " + String(s.id) + " " + String( s.bikes.count) // shows too big numbers
nrOfAvailable = String(b.distance) + "M"
print(s.id)
print("Nr of bikes")
print(s.bikes.count)
}
}
// UPDATE UI after all calculations have been done
DispatchQueue.main.async {
lbAvailable.text = available
nrOfAvailable.text = nrOfAvailable
annotationView.layoutIfNeeded()
self.view.backgroundColor = . black;
self.view.layoutIfNeeded()
}
}
説明する。
-
で非同期タスクを開始した場合
queue.async
- このバックグラウンドのジョブの内部で、forループを開始します。
- このループは、いくつかのUIビットを更新する必要があります。
- これはメインスレッドで行うので、この部分をメインスレッドに切り替える
説明2.
- UIKitはスレッドセーフではありません。つまり、すべての変更はメインスレッドから来ることを想定しており、同期的(次々と)であることを意味します。そのため、ロック機構や保護機能はありません。もし、異なるスレッドから同時にラベルを変更しようとすると、 レースコンディションにより、ラベルの一部が異なる順序で変更されるなど、 奇妙なことが起こる可能性があります。
関連
-
[解決済み] 他のスレッドからGUIを更新するにはどうすればよいですか?
-
[解決済み] SwiftでString.Indexはどのように動作するのか
-
[解決済み] Pythonでスレッドから戻り値を取得する方法は?
-
[解決済み] 現在のスレッドがメインスレッドでないことを確認する方法
-
[解決済み] Swiftの'open'キーワードは何ですか?
-
[解決済み】メインスレッドで他のスレッドからコードを実行する
-
[解決済み】==と===の違いについて
-
[解決済み】プログラムによってナビゲーションのタイトルを変更する
-
[解決済み】Swiftのenumのカウントを取得する方法は?
-
[解決済み】なぜ、Swiftの文字列では、?のような絵文字が奇妙に扱われるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] XCTest の基礎となるモジュールをロードできない
-
[解決済み] swiftにおけるconvenience initとinitの違いは何ですか、より良い明示的な例
-
[解決済み] Swiftで文字列が別の文字列を含んでいるかどうかを確認するには?
-
[解決済み] Swift stdlib ツール エラー
-
[解決済み] なぜswiftではアンダースコアが必要なのですか?
-
[解決済み] Swiftベースのアプリケーションは、OS X 10.9/iOS 7以下でも動作しますか?
-
[解決済み] Swift: print() vs println() vs NSLog()
-
[解決済み】Swift 4でStringのsubstringを使うには?'substring(to:)'は非推奨です。部分的な範囲から'演算子を持つ文字列スライス添字を使用してください。
-
[解決済み】SwiftのwillSetとdidSetの目的は何ですか?
-
[解決済み】Swiftの構造体のために、メンバーごとの初期化子をデフォルトで公開するにはどうすればよいですか?