2017-01-09 4 views
1

私は以前にこのような質問をしましたが、この質問はSwiftの一般的な言語と基本についての詳細です。以下のコードでは、これが技術的に機能し、ラベルテキストを変更するべきではありませんか?私はしばらくそれを実行していて、失敗するたびに実行しています。私はすべてのアウトレットが適切にリンクされていることを確認しました。申し訳ありませんが答えが明らかな場合は、私はスウィフトに新しいです。代わりに、この関数を使ってUILabelを更新しています....何かが欠落していますか?

func changeLabel() { 
    DispatchQueue.main.sync(execute: { 
     self.testText.text = "YES" 
    }) 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let city:String? = nil 
    if city == nil { 
     changeLabel() 
    } 
} 

答えて

2

viewDidLoadは常にメインスレッドから呼び出されます。

DispatchQueue.main.syncを使用してラベルを更新する必要はありません。実際、この場合は悪いです。既にメインキューにあるときにDispatchQueue.main.syncを呼び出すと、アプリが終了するまでアプリのユーザーインターフェイスがハングします。それはあなたが投稿したコードでは必要ではないですので、

  1. DispatchQueue.main.syncの使用を削除します。

    次の2つの選択肢があります。

  2. syncからasyncに変更してください。これにより、アプリケーションのユーザーインターフェイスがハングアップする問題が修正され、changeLabelメソッドを任意のキューから呼び出して正常に動作させることができます。
+0

ありがとうございます。私はここ数日間、私が取り組んでいるプロジェクトについてこれについて調べてきました。私はちょうど正しい答えを見つけることができませんでした。ありがたいことに、これですべて解決されました。 – Gabe

-2

使用:( - それは全体他の問題だプログラマが誤ってそうしない限り)

func changeLabel() { 
    DispatchQueue.global().async(execute: { 
    print("teste") 
    DispatchQueue.main.sync{ 
     self.testText.text = "YES" 
    }}) 

おかげ

+0

なぜですか?いずれかのディスパッチキューのポイントは何ですか? – rmaddy

関連する問題