Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Meet async/await in Swift #3

Closed
samsung-ga opened this issue Jun 4, 2022 · 0 comments
Closed

Meet async/await in Swift #3

samsung-ga opened this issue Jun 4, 2022 · 0 comments
Assignees

Comments

@samsung-ga
Copy link
Collaborator

samsung-ga commented Jun 4, 2022

Asychronous Programming

  • 비동기 프로그래밍
  • API 통신, thumbnail 로딩, 다운로드 등과 같이 오래 걸리는 작업들이 있을 때,
  • 여러 작업을 동시에 실행할 수 있도록 하기 위한 프로그래밍 방식이다.
  • Swift에서 기존에는 Completion callbackDelegate pattern을 이용해서 비동기처리를 해왔다.
  • iOS15 부터 async await syntax 도입

Asnyc / await 이란?

Completion handler의 단점

  • 길고 복잡한 코드.
  • 따라가기 어려운 코드때문에 작성한 의도를 이해하기 어렵다.
  • 미묘한 버그가 침투할 수 있는 기회를 다소 많이 제공한다.
  • 영상에서는 20줄의 코드에 5번의 버그 침투 기회가 있었음 😿
  • Result<UIImage, Error> 타입을 이용하여 좀 더 안전하게 작성이 가능하지만
  • 코드를 길게 만들고 보기 싫게 만든다.
// ✅ Completion handler를 이용한 비동기 처리 방식 
func fetchThumbnail(for id: String, completion: @escaping (UIImage?, Error?) -> Void) {
    let request = thumbnailURLRequest(for: id)
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        if let error = error {
            completion(nil, error) // ✅
        } else if (response as? HTTPURLResponse)?.statusCode != 200 {
            completion(nil, FetchError.badID) // ✅
        } else {
            guard let image = UIImage(data: data!) else {
                completion(nil, FetchError.badImage) // ✅
                return
            }
            image.prepareThumbnail(of: CGSize(width: 40, height: 40)) { thumbnail in
                guard let thumbnail = thumbnail else {
                    completion(nil, FetchError.badImage) // ✅
                    return
                }
                completion(thumbnail, nil) // ✅
            }
        }
    }
    task.resume()
}

1. Async / await 등장

  • Swift 5.5, Xcode 13, iOS 15 이상부터 사용 가능한 새로운 비동기 처리 방식
  • async
    • 실행을 일시 중단/재개할 수 있는 비동기 함수
    • 컴파일 타임에서 해당 함수의 리턴 값을 체크 가능
  • await
    • 비동기 함수 호출 (코드 일시 중단)
  • caller에서 Task를 이용해서 주어진 클로저를 비동기 컨텍스트에서 실행
// ✅ Async Await을 이용한 비동기 처리 방식 
func fetchThumbnail(for id: String) async throws -> UIImage {
    let request = thumbnailURLRequest(for: id)  
    let (data, response) = try await URLSession.shared.data(for: request)
    guard (response as? HTTPURLResponse)?.statusCode == 200 else { throw FetchError.badID }
    let maybeImage = UIImage(data: data)
    guard let thumbnail = await maybeImage?.thumbnail else { throw FetchError.badImage }
    return thumbnail
}

async

  • 비동기 태스크를 정의하는 키워드
    -. 함수의 매개변수 뒤이자, throws 키워드 앞에 선언
    -. 비동기 태스크가 결과를 반환할 때까지 실행 일시 중지 가능
    -. 컴파일러는 함수가 무조건 비동기 컨텍스트에서 호출됨을 보장
  • 런타임은 새로운 스레드풀을 생성하여 메소드 작업 관리

await

  • 코드가 실행을 일시 중단할 것이라는 의미의 키워드
  • supsension point : 다른 스레드에서 작업을 실행한 후, 현재 스레드 실행을 중단하는 포인트
  • suspension point에서 다른 스레드 작업이 끝날 때까지 대기하고, 작업이 완료되면 다시 supsension point에서 코드가 이어진다.

2. Async Await 장점

  • 이전보다 더 안전하고 의도를 볼 수 있는 코드 작성 가능
  • 런타임에 공유 시스템 자원을 적절히 사용할 수 있도록 최적화
  • 문법, 코드의 실행 흐름이 단순해짐에 따라 코드 이해도가 상승

3. Dig In

  • Async 프로퍼티
    • 메소드 뿐만 아니라 프로퍼티도 async 처리 가능
    • get 무조건 입력 O, set은 입력 X
  • Async sequence
    • for문을 await 키워드를 이용해서 비동기적으로 작동하게 함
  • Suspend
    • 비동기함수 일시중단.
    • 스레드 제어권을 포기한다는 의미
    • 시스템에 스레드 제어권을 넘겨 다른 작업을 수행 가능토록 한다.

Adopting Async/await

  1. async/await을 이용한 Testing
  2. sync to async
  3. Async APIs
  4. Async alternatives and continuations
  5. Storing the
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants