如何在Swift 3中创建调度队列

时间:2016-06-14 07:41:51

标签: ios swift3 xcode8 grand-central-dispatch dispatch-after

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

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

但是这并没有在Swift 3中编译。

在Swift 3中写这个的首选方法是什么?

15 个答案:

答案 0 :(得分:1065)

创建并发队列

let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {

}  

创建一个串行队列

let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync { 

}

异步获取主队列

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`
}

如果您想了解如何使用这些队列。请参阅此answer

答案 1 :(得分:52)

Swift 3 下编译。此示例包含我们需要的大部分语法。

QoS - 新的服务质量语法

weak self - 破坏保留周期

如果自己不可用,则什么都不做

async global background queue - 用于网络查询

async main queue - 用于触摸用户界面。

当然,您需要为此添加一些错误检查...

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

答案 2 :(得分:28)

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

        }
    }

}

答案 3 :(得分:9)

由于上面已经回答了OP问题,我只想添加一些速度考虑因素:

DispatchQueue.global 中为您的异步函数指定的优先级类别会有很大的不同。

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

以下是来自计算密集型函数的一些实际数据,这些函数从XML文件读取(带缓冲)并执行数据插值:

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

  1. iPhone X:18.7s / 6.3s / 1.8s / 1.8s / 1.8s
  2. iPhone 7:4.6s / 3.1s / 3.0s / 2.8s / 2.6s
  3. iPhone 5s:7.3s / 6.1s / 4.0s / 4.0s / 3.8s
  4. 请注意,所有设备的数据集都不相同。它是iPhone X上最大的,也是iPhone 5s上最小的。

答案 4 :(得分:6)

我这样做了,如果您想刷新UI以显示新数据而没有用户注意到,就像在UITableView或UIPickerView中一样,这一点尤为重要。

    DispatchQueue.main.async
 {
   /*Write your thread code here*/
 }

答案 5 :(得分:3)

 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
}

//如果需要在viewcontroller上填充对象(labels,imageview,textview),请使用Operation Queue

答案 6 :(得分:2)

   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版本形成对比。

答案 7 :(得分:2)

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
}

答案 8 :(得分:2)

Swift 3

你想在swift代码中调用一些闭包然后你想在故事板中更改ya任何类型的更改属于查看你的应用程序将崩溃

但是你想使用调度方法你的应用程序不会崩溃

异步方法

DispatchQueue.main.async 
{
 //Write code here                                   

}

同步方法

DispatchQueue.main.sync 
{
     //Write code here                                  

}

答案 9 :(得分:0)

对于Swift 3

   DispatchQueue.main.async {
        // Write your code here
    }

答案 10 :(得分:0)

 let newQueue = DispatchQueue(label: "newname")
 newQueue.sync { 

 // your code

 }

答案 11 :(得分:0)

更新为快速5

  

序列队列

let serialQueue = DispatchQueue.init(label: "serialQueue")
serialQueue.async {
    // code to execute
}
  

并发队列

let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)

concurrentQueue.async {
// code to execute
}

来自Apple documentation

参数

标签

要附加到队列的字符串标签,以在诸如工具,样本,堆栈快照和崩溃报告之类的调试工具中对其进行唯一标识。由于应用程序,库和框架都可以创建自己的调度队列,因此建议使用反向DNS命名方式(com.example.myqueue)。此参数是可选的,可以为NULL。

环境

与队列关联的服务质量级别。此值确定系统安排任务执行的优先级。有关可能值的列表,请参见DispatchQoS.QoSClass。

属性

与队列关联的属性。包括并发属性以创建可以同时执行任务的调度队列。如果省略该属性,则调度队列将顺序执行任务。

自动释放频率

自动释放队列调度的块创建的对象的频率。有关可能值的列表,请参见DispatchQueue.AutoreleaseFrequency

目标

要在其上执行块的目标队列。如果希望系统提供适合当前对象的队列,请指定DISPATCH_TARGET_QUEUE_DEFAULT。

答案 12 :(得分:-3)

现在只是:

sDict = {}
for snt in sentences:
    num_words = len(snt.split())
    if num_words in sDict:
        sDict[num_words] += 1
    else:
        sDict[num_words] = 1

默认为serial,要获得并发,请使用可选属性参数.concurrent

答案 13 :(得分:-3)

DispatchQueue.main.async(execute: {
   // code
})

答案 14 :(得分:-4)

您可以在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*/
}