Swift的執行緒分為主要和背景。 Main Queue / Concurrent Queue 主執行緒不能執行同步工作,只能執行非同步工作。

主執行緒語法

1
2
3
4
5
6
7
8
let task1 = {
	for i in 1...5{
		print ("Task1: (\i)")
	}
}

// DispatchQueue.main.sync(execute: task1)
DispatchQueue.main.async(execute: task1)

背景執行緒語法

不指定執行緒

1
2
DispatchQueue.global().sync(execute: task1)
DispatchQueue.global().async(execute: task1)

指定執行緒

1
2
DispatchQueue.global(qos: .background).sync(execute:task1)
DispatchQueue.global(qos: .background).async(execute:task1)

下載方法

NSData

  1. 利用url生出網址
  2. 利用Data Class下載(以前叫NSData)
  3. 把下載下來的資料指定給想要的檔案

記得要使用DispatchQueue.global().async使用此function,否則畫面會被block住。
下載完畢後要更新UI時要使用ispatchQueue.main.async否則畫面不會即時更新。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
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來更新。

  1. 利用url生出網址
  2. 利用Session的dataTask
    • 指定網址
    • 指定下載完成後要做的事 (若要更新UI,記得要在Mainthread執行)
    • 會回傳一個URLSessionDataTask的instance作為此任務的標記
  3. 將剛剛接收到的instance.resume()才會開始執行任務
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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()