이번 10강에서는 멀티쓰레딩과 오토레이아웃에 대해서 다룹니다.
Multithreading
기본적으로 UI관련 코드는 메인쓰레드에서 실행됩니다. iOS에서는 UI의 반응성을 중요하게 생각하고, 입장에서 앱이 멈추지 않고 즉각적으로 반응하기를 바라기 때문입니다.
Queues
멀티쓰레딩은 거의 iOS의 "큐"에 관한 내용입니다. 메서드들을 큐에 줄 세운 다음 큐에서 메서드들을 꺼내서 실행시키게됩니다. 큐는 "serial"이거나 "concurrent" 일 수 있습니다. 멀티코어 프로세서를 사용하는 기기라면 병렬적으로 실행 할 수 있습니다. 오랜 시간이 걸리는 네트워크 작업 같은 것들은 Global 큐에서 실행하는 것이 좋다고 합니다.
- Main 큐 👉 UI 관련 기능만을 수행한다
- Global 큐 👉 main 큐에 들어가지 않은 작업들을 수행하는데 shared, global, concurrent 큐가 있다
// main 큐 가져오는 법
let mainQueue = DispatchQueue.main
// global 큐 가져오는 법, global 큐 종류
let backgroundQueue = DispatchQueue.global(qos: DispatchQoS)
DispatchQoS.userInteractive // high priority, only do something short and quick
DispatchQoS.userInitiated // high priority, but might take a little bit of time
DispatchQoS.background // not directly initiated by user, so can run as slow as needed
DispatchQoS.utility // long-running background processes, low priority
코드 블럭을 큐에 넣는 방법
동기/비동기 방식이 있습니다. 보통은 async를 더 많이 쓴다고 합니다.
// 클로저를 큐에 넣고 현재 큐는 계속 실행한다.
queue.async { . . . }
// 현재 큐를 멈춘 후 클로저를 다른 큐에 넣고 끝날 때까지 기다린다.
queue.sync { . . . }
개발자가 원한다면 다른 큐를 생성할 수 있습니다. Label은 디버거에 나타나기 때문에 어떤 큐를 타나내는지 알 수 있습니다.
let serialQueue = DispatchQueue(label: "MySerialQ")
let concurrentQueue = DispatchQueue(label: "MyConcurrentQ", attributes: .concurrent)
OperationQueue, Operation이라는 개념도 있는데 이 둘은 병렬 프로세싱에서 수학 방정식을 사용할 때가 있는데 병렬 작업들이 서로 의존되는 경우가 많습니다. Operation은 의존성을 설정할 수 있도록 해줍니다. 이 강의에서는 의존성에 대해 다루지 않고, DispatchQueue에 대해서만 다룰 예정이라고 합니다.
Example
아래 예시에서 "do UI stuff here"을 부분을 메인 쓰레드에서 위에서 설명한 것처럼 UI 관련 코드를 실행하게 됩니다.
let session = URLSession(configuration: .default)
if let url = URL(string: "http://stanford.edu/...") {
let task = session.dataTask(with: url) { (data: Data?, response, error) in
DispatchQueue.main.async {
// do UI stuff here
}
}
task.resume()
}
Autolayout
오토레이아웃은 3강에서 설명해서 데모를 위한 간략한 설명만 하고 넘어가서 3강을 정리한 링크로 대체합니다.
👉 https://beck-ios.tistory.com/4
유튜브 영상
'CS193P' 카테고리의 다른 글
[iOS] 스탠포드 CS193P 12강 (0) | 2021.09.16 |
---|---|
[iOS] 스탠포드 CS193P 11강 (0) | 2021.09.15 |
[iOS] 스탠포드 CS193P 9강 (0) | 2021.09.02 |
[iOS] 스탠포드 CS193P 8강 (0) | 2021.09.02 |
[iOS] 스탠포드 CS193P 7강 (0) | 2021.09.01 |