393 grand-central-dispatch ios swift3 xcode8 dispatch-after
在Swift 2中,我能够使用以下代码创建队列:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Run Code Online (Sandbox Code Playgroud)
但这不能在Swift 3中编译.
在Swift 3中写这个的首选方法是什么?
LC *_*C 웃 1111
创建并发队列
let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {
}
Run Code Online (Sandbox Code Playgroud)
创建一个串行队列
let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync {
}
Run Code Online (Sandbox Code Playgroud)
异步获取主队列
DispatchQueue.main.async {
}
Run Code Online (Sandbox Code Playgroud)
同步获取主队列
DispatchQueue.main.sync {
}
Run Code Online (Sandbox Code Playgroud)
获得一个后台线程
DispatchQueue.global(qos: .background).async {
}
Run Code Online (Sandbox Code Playgroud)
Xcode 8.2 beta 2:
获得一个后台线程
DispatchQueue.global(qos: .default).async {
}
DispatchQueue.global().async {
// qos' default value is ´DispatchQoS.QoSClass.default`
}
Run Code Online (Sandbox Code Playgroud)
如果您想了解如何使用这些队列.请参阅此答案
t1s*_*ser 54
在Swift 3下编译.此示例包含我们需要的大部分语法.
QoS - 新的服务质量语法
weak self
- 破坏保留周期
如果自己不可用,什么也不做
async global background queue
- 用于网络查询
async main queue
- 用于触摸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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 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()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Cos*_*min 10
由于上面已经回答了OP问题,我只想添加一些速度考虑因素:
在DispatchQueue.global中为异步函数指定的优先级等级会有很大的不同.
我不建议使用.background线程优先级运行任务,尤其是在iPhone X上,其中任务似乎分配在低功耗内核上.
以下是来自计算密集型函数的一些实际数据,这些函数从XML文件读取(带缓冲)并执行数据插值:
设备名称/ .background/.utility/.default/.userInitiated/.userInteractive
请注意,所有设备的数据集都不相同.它是iPhone X上最大的,也是iPhone 5s上最小的.
快速 5 的更新
串行队列
let serialQueue = DispatchQueue.init(label: "serialQueue")
serialQueue.async {
// code to execute
}
Run Code Online (Sandbox Code Playgroud)
并发队列
let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
concurrentQueue.async {
// code to execute
}
Run Code Online (Sandbox Code Playgroud)
来自苹果文档:
参数
标签
附加到队列的字符串标签,以便在调试工具(例如仪器、示例、堆栈快照和崩溃报告)中唯一标识它。由于应用程序、库和框架都可以创建自己的调度队列,因此建议使用反向 DNS 命名样式 (com.example.myqueue)。该参数是可选的并且可以为 NULL。
服务质量
与队列关联的服务质量级别。该值决定了系统调度任务执行的优先级。有关可能值的列表,请参阅 DispatchQoS.QoSClass。
属性
与队列关联的属性。包含并发属性以创建并发执行任务的调度队列。如果省略该属性,调度队列将串行执行任务。
自动释放频率
自动释放由队列调度的块创建的对象的频率。有关可能值的列表,请参阅DispatchQueue.AutoreleaseFrequency。
目标
要执行块的目标队列。如果您希望系统提供适合当前对象的队列,请指定 DISPATCH_TARGET_QUEUE_DEFAULT。
小智 6
我这样做了,如果您想刷新UI以显示新数据而没有用户注意到UITableView或UIPickerView,这一点尤其重要.
DispatchQueue.main.async
{
/*Write your thread code here*/
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
315602 次 |
最近记录: |