在Swift 2中,我能够用以下代码创建队列:

let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)

但是这不能在Swift 3中编译。

在Swift 3中,首选的方式是什么?


当前回答

由于OP问题已经在上面得到了回答,我只想添加一些速度方面的考虑:

在DispatchQueue.global中为async函数分配的优先级类有很大不同。

我不建议使用.background线程优先级运行任务,尤其是在iPhone X上,因为任务似乎是分配在低功耗内核上的。

下面是一个计算密集型函数的一些真实数据,该函数从XML文件中读取(带缓冲)并执行数据插值:

设备名/ .background / .utility / .default / .userInitiated / .userInteractive

iPhone X: 18.7s / 6.3s / 1.8s / 1.8s iPhone 7: 4.6s / 3.1s / 3.0s / 2.8s / 2.6s iPhone 5s: 7.3s / 6.1s / 4.0s / 4.0s / 3.8s

注意,并不是所有设备的数据集都相同。iPhone X最大,iPhone 5s最小。

其他回答

斯威夫特3

你想在swift代码中调用一些闭包然后你想在storyboard中改变任何类型的改变属于视图,你的应用程序会崩溃

但是你要使用分派方法,你的应用程序不会崩溃

异步方法

DispatchQueue.main.async 
{
 //Write code here                                   

}

同步方法

DispatchQueue.main.sync 
{
     //Write code here                                  

}

在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()
            }

        }
    }

}

你可以在swift 3.0中使用这段代码创建调度队列

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*/
}

在>=Swift 3下编译。这个例子包含了我们需要的大部分语法。

QoS——新的服务质量语法

弱自中断保留周期

如果self不可用,什么都不做

Async全局实用程序队列——用于网络查询,不等待结果,它是一个并发队列,块(通常)在启动时不等待。并发队列的例外可能是,当它的任务限制已经达到时,队列临时变成一个串行队列并等待,直到该队列中的某个先前的任务完成。

async主队列——对于触摸UI,块不等待结果,而是等待它在开始时的槽。主队列是一个串行队列。

当然,你需要添加一些错误检查…

DispatchQueue.global(qos: .utility).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
            }
        }
    }
}
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
}