信號量
DispatchSemaphore 是GCD提供的API,通過設(shè)置一個閾值,允許競爭許可信號最大的線程數(shù)
- 詳細(xì)機制
-
wait方法判斷和獲取信號量,當(dāng)前信號量>0,開始執(zhí)行任務(wù)(線程),獲取信號量(-1)
任務(wù)(線程)執(zhí)行結(jié)束,調(diào)用signal方法,釋放信號量(+1)
2.wait方法判斷和獲取信號量,當(dāng)前信號量<=0,線程進入阻塞狀態(tài)
import Foundation
let maxConcurrentDownloads = 3
let semaphore = DispatchSemaphore(value: maxConcurrentDownloads)
func downloadFile(url: URL, completion: @escaping (Data?, Error?) -> Void) {
semaphore.wait() // 獲取信號量-1
print("Starting download for \(url)")
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
print("Download failed: \(error)")
completion(nil, error)
} else {
print("Download completed for \(url)")
completion(data, nil)
}
semaphore.signal() // 釋放信號量+1
}
task.resume()//啟動任務(wù)
}
let urls = [
URL(string: "https://example.com/file1")!,
URL(string: "https://example.com/file2")!,
URL(string: "https://example.com/file3")!,
URL(string: "https://example.com/file4")!
]
for url in urls {
downloadFile(url: url) { data, error in
if let data = data {
// 處理下載的數(shù)據(jù)
print("Downloaded data: \(data.count) bytes")
} else if let error = error {
// 處理錯誤
print("Error: \(error)")
}
}
}
// 保持主線程運行,以便所有下載任務(wù)完成
RunLoop.main.run()