如何使用线程在迅速?
dispatchOnMainThread:^{
NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));
}];
如何使用线程在迅速?
dispatchOnMainThread:^{
NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));
}];
当前回答
在我们的iOS应用中,中央调度是用来处理多任务的。
您可以使用此代码
// Using time interval
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+1) {
print("Hello World")
}
// Background thread
queue.sync {
for i in 0..<10 {
print("Hello", i)
}
}
// Main thread
for i in 20..<30 {
print("Hello", i)
}
更多信息请访问这个链接:https://www.programminghub.us/2018/07/integrate-dispatcher-in-swift.html
其他回答
好的答案,无论如何,我想分享我的面向对象的解决方案,直到swift 5。
请查看它:AsyncTask
从概念上受到android的AsyncTask的启发,我用Swift写了自己的类
AsyncTask允许正确和简单地使用UI线程。该类允许执行后台操作并在UI线程上发布结果。
下面是一些用法示例
例1 -
AsyncTask(backgroundTask: {(p:String)->Void in//set BGParam to String and BGResult to Void
print(p);//print the value in background thread
}).execute("Hello async");//execute with value 'Hello async'
例2 -
let task2=AsyncTask(beforeTask: {
print("pre execution");//print 'pre execution' before backgroundTask
},backgroundTask:{(p:Int)->String in//set BGParam to Int & BGResult to String
if p>0{//check if execution value is bigger than zero
return "positive"//pass String "poitive" to afterTask
}
return "negative";//otherwise pass String "negative"
}, afterTask: {(p:String) in
print(p);//print background task result
});
task2.execute(1);//execute with value 1
它有两个泛型类型:
BGParam -执行时发送给任务的参数类型。 BGResult -后台计算结果的类型。 当你创建一个AsyncTask时,你可以将这些类型传递给任何你需要传入和传入后台任务的类型,但如果你不需要这些类型,你可以将其标记为未使用的,只需将其设置为:Void或使用更短的语法:()
当一个异步任务执行时,它经过3个步骤:
beforeTask:()->在任务执行之前在UI线程上调用的Void。 backgroundTask: (param:BGParam)->BGResult在后台线程立即调用 afterTask:(参数:BGResult)->在UI线程上调用后台任务结果的Void
最佳实践是定义一个可多次访问的可重用函数。
可重用的功能:
例如,AppDelegate.swift是一个全局函数。
func backgroundThread(_ delay: Double = 0.0, background: (() -> Void)? = nil, completion: (() -> Void)? = nil) {
dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) {
background?()
let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue()) {
completion?()
}
}
}
注意:在Swift 2.0中替换QOS_CLASS_USER_INITIATED。使用QOS_CLASS_USER_INITIATED。rawValue相反
用法:
a .在后台运行一个进程,延迟3秒:
backgroundThread(3.0, background: {
// Your background function here
})
B.在后台运行一个进程,然后在前台运行一个补全:
backgroundThread(background: {
// Your function here to run in the background
},
completion: {
// A function to run in the foreground when the background thread is complete
})
C.延迟3秒-注意使用completion参数而不使用background参数:
backgroundThread(3.0, completion: {
// Your delayed function here to be run in the foreground
})
Swift 3版本
Swift 3利用新的DispatchQueue类来管理队列和线程。要在后台线程上运行一些东西,你可以使用:
let backgroundQueue = DispatchQueue(label: "com.app.queue", qos: .background)
backgroundQueue.async {
print("Run on background thread")
}
或者如果你想在两行代码中实现:
DispatchQueue.global(qos: .background).async {
print("Run on background thread")
DispatchQueue.main.async {
print("We finished that.")
// only back on the main thread, may you access UI:
label.text = "Done."
}
}
你也可以在本教程中获得一些关于Swift 3中GDC的深入信息。
你必须将你想要在后台运行的更改与你想要在UI上运行的更新分开:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
// do your task
dispatch_async(dispatch_get_main_queue()) {
// update some UI
}
}
我真的很喜欢Dan Beaulieu的答案,但是它在Swift 2.2中不起作用,我认为我们可以避免那些讨厌的强制打开!
func backgroundThread(delay: Double = 0.0, background: (() -> Void)? = nil, completion: (() -> Void)? = nil) {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
background?()
if let completion = completion{
let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue()) {
completion()
}
}
}
}