如何在Swift 3中创build调度队列
在Swift 2中,我可以用下面的代码创build队列:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
但是这不能在Swift 3中编译。
在Swift 3中写这个的首选方法是什么?
创build一个并发队列
let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent) concurrentQueue.sync { }
创build一个串行队列
let serialQueue = DispatchQueue(label: "queuename") serialQueue.sync { }
asynchronous获取主队列
DispatchQueue.main.async { }
主队列同步
DispatchQueue.main.sync { }
获取后台线程之一
DispatchQueue.global(qos: .background).async { }
Xcode 8.2 beta 2:
获取后台线程之一
DispatchQueue.global(qos: .default).async { } DispatchQueue.global().async { // qos' default value is ´DispatchQoS.QoSClass.default` }
如果你想了解使用这些队列。看到这个答案
在Swift下编译3 。 这个例子包含了我们需要的大部分语法。
QoS – 新的服务质量语法
weak self
破坏保留周期
如果自己不可用,什么都不要做
async global background queue
– 用于networking查询
async main queue
– 用于触摸UI。
当然,你需要添加一些错误检查到这…
DispatchQueue.global(qos: .background).async { [weak self] () -> Void in guard let strongSelf = self else { return } strongSelf.flickrPhoto.loadLargeImage { loadedFlickrPhoto, error in if error != nil { print("error:\(error)") } else { DispatchQueue.main.async { () -> Void in activityIndicator.removeFromSuperview() strongSelf.imageView.image = strongSelf.flickrPhoto.largeImage } } } }
在XCode 8,Swift 3编译https://github.com/rpthomas/Jedisware
@IBAction func tap(_ sender: AnyObject) { let thisEmail = "emailaddress.com" let thisPassword = "myPassword" DispatchQueue.global(qos: .background).async { // Validate user input let result = self.validate(thisEmail, password: thisPassword) // Go back to the main thread to update the UI DispatchQueue.main.async { if !result { self.displayFailureAlert() } } } }
我这样做,这是特别重要的,如果你想刷新你的用户界面显示新的数据没有用户注意到像UITableView或UIPickerView。
DispatchQueue.main.async { /*Write your thread code here*/ }
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT) //Swift 2 version let concurrentQueue = DispatchQueue(label:"com.swift3.imageQueue", attributes: .concurrent) //Swift 3 version
我重新在Xcode 8,Swift 3中处理了你的代码,这些变化被标记为与你的Swift 2版本相反。
DispatchQueue.main.async { self.collectionView?.reloadData() // Depends if you were populating a collection view or table view } OperationQueue.main.addOperation { self.lblGenre.text = self.movGenre }
//如果您需要在视图控制器上填充对象(标签,图像视图,文本视图),则使用“操作队列”
Swift 3
你想在swift代码中调用一些闭包,然后你想在故事板中更改任何types的closures更改属于查看您的应用程序将崩溃
但是你想用dispatch方法你的应用程序不会崩溃
asynchronous方法
DispatchQueue.main.async { //Write code here }
同步方法
DispatchQueue.main.sync { //Write code here }
对于Swift 3
DispatchQueue.main.async { // Write your code here }
let newQueue = DispatchQueue(label: "newname") newQueue.sync { // your code }
您可以在swift 3.0中使用此代码创build调度队列
DispatchQueue.main.async { /*Write your code here*/ } /* or */ let delayTime = DispatchTime.now() + Double(Int64(0.5 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) DispatchQueue.main.asyncAfter(deadline: delayTime) { /*Write your code here*/ }
DispatchQueue.main.async(execute: { // write code })
串行队列:
let serial = DispatchQueue(label: "Queuename") serial.sync { //Code Here }
并发队列:
let concurrent = DispatchQueue(label: "Queuename", attributes: .concurrent) concurrent.sync { //Code Here }
现在简单地说:
let serialQueue = DispatchQueue(label: "my serial queue")
默认是串行的,要获得并发的,你使用可选属性参数.concurrent
DispatchQueue.main.async(execute: { // code })