如何在Swift中使用多线程

时间:2016-05-27 10:16:17

标签: swift multithreading swift2

我有两个任务:task1和task2。我想在task1完成后执行task2。

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 ...它不起作用。如何在swift中使用lock?你能根据我的代码给我一个例子吗?谢谢。

PS:我不想在这里使用callback ...因为我已经尝试过了,我认为多线程更接近我的答案,谢谢。

1 个答案:

答案 0 :(得分:0)

我正在跛行并对你的程序结构做出一些猜测。您的代码的第一个问题是它正在尝试访问后台线程上的视图。应始终在主线程上访问GUI元素。第二个问题是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)
}