日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swift - 多线程GCD详解

發布時間:2025/4/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。