일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- SWIFT
- 오블완
- ios
- WWDC
- modern concurrency deep dive
- 티스토리챌린지
- 야곰 # 야곰아카데미커리어스타터캠프 #iOS개발자 # 부트캠프
- APNS
- modern concurrency
- Today
- Total
목록전체 글 (71)
Geon
작업 취소- Task 내부에, Task 구현시 취소를 전파하지 못함- try? await 은 nil 을 리턴하여 취소시에 에러를 리턴하지 않고 바로 다음줄 실행- Task.checkCancellation() 은 취소에 대한 에러를 리턴해줌var task = Task { print("시작") Task { await someFunction() await someFunction() await someFunction() print(Task.isCancelled) // false } } sleep(3) task.cancel()
Task Cancel- 비동기 함수 내에서 작업 취소에 대한 로직을 넣어줘야 작업이 취소됨func failCancelFunction() asnyc { // Do something }func cancelFunction() asnyc throws { guard !Task.isCancelled else { throw CancellationError() } // Do Something}var task: Task?task = Task { await failCancelFunction() // 취소 동작 안함 await cancelFunction() // 취소 동작함}task.cancel()?
비 구조화된 동시성- 취소 전파 불가능Task // 메타데이터 상속됨Task.detached // 메타데이터를 상속하지 않음 - Task.detached는 분리된 작업이므로, self를 캠쳐해야함 구조화된 동시성- 부모와 자식의 관계를 만듬- 취소 전파 가능- 끝나는 시점을 알수 있음async letTaskGroup
구조적 동시성- 부모 작업과 자식 작업간의 명시적인 계층관계가 생성됨- 부모작업은 자식작업이 모두 완료되는것을 기다림- 자식 작업에서 우선순위가 높아지면 부모 작업 우선순위도 상승됨async let(동시 바인딩)TaskGroup- 취소 및 메타데이터 상속
TaskGroupawait withTaskGroup(of: UIImage?.self, returning: [UIImage].self) { group in group.addTask { // Do SomeThing // ex: 2번 쓰레드 작업됨 } group.addTask { // Do SomeThing g // ex: 3번 쓰레드 작업됨 } for await image in group { // 비동기 반복문이며 ex: 4번 쓰레드 작업됨,Race Condition 해결해줌 if let image = image { imageArray.append(image) } }}- groupTask중 먼저 끝나는 순서대로 imageArrayAppend 수행- group은 내부적으로 task가 끝나는 시..
Task.Sleep- GCD의 sleep과 Task.sleep의 차이는 blocking과 Non-blocking의 차이이다- GCD의 sleep은 blocking 됨(mainThread에 사용하면 안됨)- Task의 sleep은 sleep되면 시스템에 Thread를 반납해 다른 동작을 처리할수 있음. 병렬 처리가 아닌경우func fetch(urlArray: [String]) async -> [UIImage] { var array: [UIImage] = [] for url in urlArray { // 하나 실행되고 기다리고 하나실행됨(병렬 처리가 아님) if let image = await fetchImage(url) { array.append(image) } //T..