私は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が初めてなので、助けが必要です。
君たちありがとう。
[〜#〜] 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
で更新します
Swift 3.0 +バージョン
DispatchQueue.main.async() {
// your UI update code
}
XCodeがSwift 2.0バージョンから正しい構文を提案できないため、これを投稿しました