Swift 多執行緒與檔案下載
Contents
Swift的執行緒分為主要和背景。 Main Queue / Concurrent Queue 主執行緒不能執行同步工作,只能執行非同步工作。
主執行緒語法
let task1 = {
for i in 1...5{
print ("Task1: (\i)")
}
}
// DispatchQueue.main.sync(execute: task1)
DispatchQueue.main.async(execute: task1)
背景執行緒語法
不指定執行緒
DispatchQueue.global().sync(execute: task1)
DispatchQueue.global().async(execute: task1)
指定執行緒
DispatchQueue.global(qos: .background).sync(execute:task1)
DispatchQueue.global(qos: .background).async(execute:task1)
下載方法
NSData
- 利用url生出網址
- 利用Data Class下載(以前叫NSData)
- 把下載下來的資料指定給想要的檔案
記得要使用DispatchQueue.global().async使用此function,否則畫面會被block住。
下載完畢後要更新UI時要使用ispatchQueue.main.async否則畫面不會即時更新。
func download(){
if let url = URL(string: "http://www.carlosicaza.com/wp-content/uploads/2014/07/Swift-logo.png"){
do {
let data = try Data(contentsOf:url)
let image = UIImage(data:data)
DispatchQueue.main.async{
self.myImage.image = image
}
}
catch{
print("Cannot download image")
}
}
}
DispatchQueue.global().async {
self.download()
}
Session
改利用Session來下載
Session的ataTask本身即是非同步,所以不會擋住UI畫面。
一樣在任務結束要更新UI時要使用main thread來更新。
- 利用url生出網址
- 利用Session的dataTask
- 指定網址
- 指定下載完成後要做的事 (若要更新UI,記得要在Mainthread執行)
- 會回傳一個URLSessionDataTask的instance作為此任務的標記
- 將剛剛接收到的instance.resume()才會開始執行任務
self.image = nil
let task = session.dataTask(with: url) {
(data, response, error) in
if error != nil{
return
}
if let loadedData = data{
let loadedImage = UIImage(data: loadedData)
DispatchQueue.main.async{
self.image = loadedImage
self.loading?.stopAnimating()
}
}
}
task.resume()