web-dev-qa-db-ja.com

スレッドを使用してSwiftでUIを更新する

私はSwiftを使用してXcode 6でソフトウェアを開発しています。ボタンを押すと、コードがWebから情報を取得してNSWindowに書き込みます。

したがって、次のようなものを想像してみてください。

@IBAction func buttonPressed(sender: AnyObject)
{
    for page in listOfPages                     //Number of pages is 40.
    {
        var label: NSTextField = NSTextField();

        label.stringValue = getInformetionsFromPage(page)

        /*
             some code to add label in the window here 
        */ 
    }
}

問題は、ボタンをクリックした後、アプリがフリーズするメインの時間に、結果のリストが表示されるまでに時間がかかることです。これは、この問題を処理するためにスレッドを使用していないためです。ループのすべてのステップですべてのラベルが更新されるのを確認するスレッドをどのように実装できますか?私はスレッドとSwiftが初めてなので、助けが必要です。

君たちありがとう。

17
Matt

[〜#〜] gcd [〜#〜] があります。基本的な使い方は次のとおりです。

for page in listOfPages {
    var label = NSTextField()
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
        let result = getInformationFromPage(page)
        dispatch_async(dispatch_get_main_queue()) {
            label.stringValue = result
        }
    }
}

dispatch_async関数は、指定されたキューでコードのブロックを非同期的に実行します。一番で dispatch_asyncコールバックグラウンドキューで実行するコードをディスパッチします。 resultを取得したら、メインキューのラベルをそのresultで更新します

13
mustafa

Swift 3.0 +バージョン

DispatchQueue.main.async() {
    // your UI update code
}

XCodeがSwift 2.0バージョンから正しい構文を提案できないため、これを投稿しました

40
Fangming