如何使用线程在迅速?

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