IOS/Swift

[TIL] Swift. GCD (Grand Central Patch)

 GCD

해야할 일(code blocks)들을 만들어서 GCD에 넘기면 시스템에서 알아서 스레드를 할당해서 안전하게 수행시켜 줍니다.

  1. GCD는 스레드 위에 만들어진 것 입니다.
  2. GCD는 이 테스크를 DispatchQueue를 이용해서 관리하게 됩니다

#Queue

  1. 자료구조입니다.
  2. First- in & First - out
  3. 들어온 순서대로 나가는 형태의 자료구조 입니다.

DispatchQueue

  1. Main Queue
    • 메인 스레드에서 작동되는 큐입니다.
  2. Global Queue
    • 시스템에 의해 관리되는 큐입니다
    • 큐에 들어가는 테스크의 우선순위를 QoS(Quality of Service) 를 이용해서 표현할수 있습니다. 번호가 낮을수록 높은 순위 입니다.
      1. userInteractive - 바로 수행되어야할 작업을 표현할 때에 사용
      2. userInitiated - 사용자가 결과를 기다리는 작업. 거의 바로 수행
      3. default - 그렇게 잘 쓰이진 않지만 2보다 좀 덜중요한 작업
      4. utility - 수초에서 수분걸리는 작업. 무거운 작업 (네트워크, 파일불러오기 등)
      5. background - 사용자에게 당장 인식될 필요가 없는 작업들 ( 뉴스다운, 위치업데이트, 영상다운로드 등)
  3. Custom Queue
    • 위에 2개는 시스템에서 제공해주는 큐입니다.
    • 커스텀 큐는 개발자가 직접 큐를 만들어주어야 할때 사용합니다.
//Main Queue
DispatchQueue.main.async {
		//DO any ui update here
}
//Global Queue
DispatchQueue.global(qos: background).async {
		//DO heavey work here
}
//Custom Queue
let concurrentQueue = DispatchQueue(label: "concurrent", qos: .backgruond, attributes:.concurrent)
let serialQueue = DispatchQueue(label: "serial", qos: .backgruond)

 두개의 Queue 같이 쓰기

  • 예를 들면 큰 이미지 파일을 다운받으면서 화면에 뿌려주는 작업까지 하려면 두개의 큐를 복합적으로 사용하게 된다.
DispatchQueue.global(qos: .background).async {
	
	let image = downloadImageFromServer()
	DispatchQueue.main.async {
			self.imageView.image = image
	}
}

큐에 들어온 테스크를 GCD는 동기 비동기로 수행할수 있습니다

(Sync( 먼저들어온 테스크 끝내고 실행) & Async( 동시실행 ))

  1. Async #### 네트워크, 다운받는 작업같은 경우 시간이 오래걸리기 때문에 Async ( 대부분 Async )

    • 동기실행이기 때문에 두개의 큐가 같이 실행이 되고 qos부분의 우선순위를 보면 아래코드가 더높기 때문에 아래코드가 먼저 실행되는 것을 볼수있다.

     2. Sync

  • Sync는 비동기실행으로 아래의 코드가 우선순위가 더 높더라고 테스크가 들어오는 순서에 따라 우선순위로 실행되고 하나의 코드가 끝이나야 뒤의 코드가 실행된다.
  • 보통 앞작업이 끝나야 뒷작업이 시작될수 있는경우 필요하다.

주의사항.

//복합적인 상황
func downloadImageFromServer() -> UIImage {
    //Heavy Task
    return UIImage()
}
func updateUI(image: UIImage){

}
DispatchQueue.global(qos: .background).async {
    // download
    let image = downloadImageFromServer()
    // ui쪽은 main큐로 넘겨주어야 한다. 크래시 가능성을 가짐
    DispatchQueue.main.async {
        updateUI(image: image)
    }
}

//Xcode에서 main thread가 백그라운드에서 발생하면 크래쉬를 발생시키기 때문에 메인 UI작업은 백그라운드가
// 아닌 메인에서 실행시켜주어야 한다.

'IOS > Swift' 카테고리의 다른 글

[TIL] Swift. Closure  (0) 2020.10.19
[TIL] Swift. Type Casting(feat. is, as)  (0) 2020.10.18
[TIL] Swift. Frame and Bounds  (0) 2020.10.15
[TIL] Swift. awakeFromNib  (0) 2020.10.14
[TIL] Swift. ViewController LifeCycle  (0) 2020.10.12