2016-05-27 16 views
1

私は2つのタスク、task1とtask2を持っています。 task1の終了後にtask2を実行したい。Swiftでマルチスレッドを使用する方法

私はインターネットで検索
let globalQueueDefault = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) 

dispatch_sync(globalQueueDefault){ 

self.activityIndicatorView.hidden = false 
self.activityIndicatorView.startAnimating() 

    task1() 

    sleep(6) 
    dispatch_sync(globalQueueDefault) {() -> Void in 

     task2()            
    } 
} 

、私はNSLockNSConditionLockobjc_sync_enterを見つける...私はそれらを試してみるが、それは動作しません...

let lock = NSLock() 
let globalQueueDefault = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) 

dispatch_sync(globalQueueDefault){ 

self.activityIndicatorView.hidden = false 

self.activityIndicatorView.startAnimating() 

self.lock.lock() 

task1() 
self.lock.unlock() 

sleep(6) 
dispatch_sync(globalQueueDefault) {() -> Void in 
self.lock.lock() 
    task2() 
self.lock.unlock()            
} 
} 

私もNSConditionLockobjc_sync_enterを試してみました。 ..それは動作しません。私はどのように迅速にlockを使用することができますか?私のコードのベースを教えてください。ありがとうございました。

PS:ここでcallbackを使用したくない...私はそれを試したので、私はマルチスレッドが私の答えにもっと近いと思う、ありがとう。

+0

複数のスレッドはどこですか?タスク1と2は何ですか?シリアルキューを使用していないのはなぜですか? – Wain

+0

申し訳ありませんが、おそらく私は間違った単語 "複数のスレッド"を使用し、 'task1()'はダウンロードjsonであり、 'Task2'は別のビューに渡します。あなたは私の質問と私が欲しいものを理解していると思いますか?自分のコードで 'lock'を使う方法を教えてください。 – user2262304

+0

ロックを使用しないでください。コールバックを使うべきです... – Wain

答えて

0

私は外に出て、プログラム構造についていくつか推測しています。コードの最初の問題は、バックグラウンドスレッドのビューにアクセスしようとしていることです。 GUI要素は常にメインスレッドでアクセスする必要があります。 2番目の問題はsleepです。これを使用して並行コードを作成しないでください。これは、非同期タスクがどのように行われるかを前提にしています。その時間を未知数として扱い、同期パターンまたはコールバックを使用する必要があります。

task1()がJSONをダウンロードしていると言われて以来、おそらく非同期です。ここで私はそれを行う方法です:

func task1(finish:() -> Void) { 
    // Set up your connection to the website 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     // Handle the response, parse the json, etc 
     ... 

     // Now call the completion handler 
     finish() 
    } 
} 

func task2() { 
    // Do whatever here 
} 

// In the function that triggers the JSON download 
func downloadJSON() { 
    self.activityIndicatorView.hidden = false 
    self.activityIndicatorView.startAnimating() 
    task1(task2) 
} 
+0

ありがとう、私は解決策を好きですが、私はあなたのコールバックの答えが正しいと思うので、私はあなたをサポートします。どうもありがとうございました – user2262304

関連する問題