我有两个任务: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()
}
}
我在互联网上搜索,我发现NSLock
,NSConditionLock
和objc_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()
}
}
我还尝试了NSConditionLock
和objc_sync_enter
...它不起作用。如何在swift中使用lock
?你能根据我的代码给我一个例子吗?谢谢。
PS:我不想在这里使用callback
...因为我已经尝试过了,我认为多线程更接近我的答案,谢谢。
答案 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)
}