Swift - 多线程GCD详解
//? GCD詳解
//? 目錄:
//? 1. 創建GCD隊列(最常用)
//? 2. 自定義創建隊列
//? 3. 使用多線程實現延遲加載
//? 4. 使用多線程實現重復(循環)
//? 5. 使用多線程來控制 多任務數據加載 和 UI 的顯示的先后順序
//? 6. 暫停隊列
//? 7. 恢復隊列
//
import UIKit
?
class ViewController: UIViewController {
?? ?
? ? @IBOutlet var myLable:UILabel?
? ? @IBAction func clickButton(){
?
? ? // 1. 創建GCD隊列(最常用)
? ? /* 第一個參數為隊列優先級。有以下(優先級從上到下依次降低)
? ? *? - DISPATCH_QUEUE_PRIORITY_HIGH:
? ? *? - DISPATCH_QUEUE_PRIORITY_DEFAULT: ? 多用默認
? ? *? - DISPATCH_QUEUE_PRIORITY_LOW:
? ? *? - DISPATCH_QUEUE_PRIORITY_BACKGROUND:
? ? *? 第二個參數為預留參數,一般為0
? ? */
? ? let myQueue:dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
? ? // 用異步的方式運行隊列里的任務
?? ? ? ?
? ? dispatch_async(myQueue, {
? ? ? ? ? ? self.sendData1()
? ? ? ? })
//--------------------------------分隔符------------------------------------>
? ? // 2. 自定義創建隊列
? ? /*
? ? ? ? 第一個參數,是創建隊列的一個標簽
? ? ? ? 第二個參數,是創建隊列的類型,有以下兩種:
? ? ? ? ? ? --> DISPATCH_QUEUE_SERIAL? (串行隊列)
? ? ? ? ? ? --> DISPATCH_QUEUE_CONCURRENT ? (并行隊列)
? ? */
? ? let myQueue1:dispatch_queue_t = dispatch_queue_create("www.yunshow.com", DISPATCH_QUEUE_CONCURRENT)
?? ?
? ? // 用異步的方式運行隊列里的任務
? ? dispatch_async(myQueue1) { () -> Void in
? ? ? ? self.sendData1()
? ? ? ? }
//--------------------------------分隔符------------------------------------>
? ? // 3. 使用多線程實現延遲加載
? ? /*
? ? ? ? 第一個參數,表示從何時開始,DISPATCH_TIME_NOW 表示從現在開始
? ? ? ? 第二個參數,NSEC_PER_SEC 是用來將2秒時間轉化為GCD的參數
? ? */
? ? let myTime : dispatch_time_t? = dispatch_time(DISPATCH_TIME_NOW,(Int64)(NSEC_PER_SEC * 2))
? ? dispatch_after(myTime, dispatch_get_main_queue()) { () -> Void in
? ? ? ? self.sendData1()
? ? ? ? }
//--------------------------------分隔符------------------------------------>
? ? // 4. 使用多線程實現重復(循環)
? ? /*
? ? ? ? 第一個參數, 表示循環的次數
? ? */
? ? dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { (UIntindex) -> Void in
?? ? ? ?
? ? ? ? print(index)
? ? ? ? }
? ? }
?? ?
? ? func sendData(){
?? ?
? ? ? ? sleep(5)
? ? }
?
? ? func updateLable(){
?? ? ? ?
? ? ? ? myLable?.text = "數據發送成功"
? ? }
? ? func sendData1(){
?? ? ? ?
? ? ? ? sleep(5)
? ? ? ? // 在主線程中更新UI
? ? ? ? dispatch_async(dispatch_get_main_queue(), {
?? ? ? ? ? ?
? ? ? ? ? ? self.updateLable()
? ? ? ? })
? ? }
//--------------------------------分隔符------------------------------------> ? ?
? ? // 5. 使用多線程來控制 多任務數據加載 和 UI 的顯示的先后順序
?? ?
? ? @IBOutlet var myImage1: UIImageView?
? ? @IBOutlet var myImage2: UIImageView?
? ? @IBOutlet var myLable1: UILabel?
? ? @IBAction func clickSend(){
? ? // 創建自定義調度組
? ? ? ? let myGroup = dispatch_group_create()
? ? // 使用調度組的異步方法將第一個任務放入
? ? ? ? dispatch_group_async(myGroup, dispatch_get_main_queue()) { () -> Void in
? ? ? ? // 從網絡中加載圖片1 的數據
? ? ? ? ? ? let myDate = NSData(contentsOfURL: NSURL(string: "")!)
? ? ? ? // UIImageView 更新加載好的圖片,UI更新應該放在主線程中異步加載
? ? ? ? ? ? dispatch_async(dispatch_get_main_queue(), { () -> Void in
?? ? ? ? ? ?
? ? ? ? ? ? ? ? self.myImage1?.image = UIImage(data: myDate!)
? ? ? ? ? ? })
? ? ? ? }
? ? // 使用調度組的異步方法將第二個任務放入
? ? ? ? dispatch_group_async(myGroup, dispatch_get_main_queue()) { () -> Void in
? ? ? ? // 從網絡中加載圖片2 的數據
? ? ? ? ? ? let myDate1 = NSData(contentsOfURL: NSURL(string: "")!)
?? ? ? ? ? ?
? ? ? ? ? ? dispatch_async(dispatch_get_main_queue(), { () -> Void in
? ? ? ? ? ? ? ? self.myImage2?.image = UIImage(data: myDate1!)
? ? ? ? ? ? })
? ? ? ? }
? ? // notify(異步) 等待通知,即等待組內的任務都完成手再執行這個線程的任務
? ? // wait (同步,會阻塞線程) 也是等待通知
? ? // 注意: 在更新數據庫操作時候,多使用 wait,其他時間多使用 notify
? ? ? ? dispatch_group_notify(myGroup, dispatch_get_main_queue()) { () -> Void in
?
? ? ? ? ? ? // 在兩張圖片都加載完畢時,在lable中顯示“加載完畢”
? ? ? ? ? ? self.myLable1?.text = "加載完畢"
? ? ? ? }
?? ? ? ?
? ? ? ? dispatch_group_wait(myGroup, DISPATCH_TIME_FOREVER)
? ? ? ? ? ? self.myLable1?.text = "加載完畢"
? ? }
//--------------------------------分隔符------------------------------------>
? ? let myQueue: dispatch_queue_t = dispatch_queue_create("www.yunshow.com", DISPATCH_QUEUE_CONCURRENT)
?? ?
? ? @IBAction func clickSuspend(){
? ? // 6. 暫停隊列 (注意:只能暫停自定義隊列,不能暫停主隊列和系統隊列)
? ? ? ? dispatch_suspend(myQueue)
? ? }
?? ?
? ? @IBAction func clickResume(){
? ? // 7. 恢復隊列? (注意:對已經暫停的隊列才能恢復)
? ? ? ? dispatch_resume(myQueue)
? ? }
?? ?
? ? override func viewDidLoad()
? ? {
? ? ? ? super.viewDidLoad()
? ? }
?
? ? override func didReceiveMemoryWarning()
? ? {
? ? ? ? super.didReceiveMemoryWarning()
? ? }
}
?
PS:蘋果官網API -?Dispatch
轉載于:https://www.cnblogs.com/gongyuhonglou/p/10311537.html
總結
以上是生活随笔為你收集整理的Swift - 多线程GCD详解的全部內容,希望文章能夠幫你解決所遇到的問題。