비동기적으로 코드를 작성하게 된다면 최종적으로 UI 업데이트는 메인스레드에서 진행되어야 한다(swift에서는!)
DispatchQueue.main.async { [weak self] in
self?.stopLoading.accept(())
}
그렇기에 우리는 이런 코드를 통해 작성하곤 했는데 이 DispatchQueue의 메서드들은 @escaping 클로저로 구현이 되어있어서 참조 관리를 해줘야 하는 등 불편함이 있었다
하지만 애플에서 여러 동시성 문제를 해결하기 위해 Actor
라는 개념을 도입하면서 메인 스레드에서 작동하기 위한 새로운 방법이 추가가 되었다
(대표적으로 data race와 같은 문제를 보다 쉽게 해결 가능)
맨 앞에 await
키워드에서 알 수 있듯이 async/await 를 통해 비동기 처리를 할 때 사용하는 키워드 인데 아래와 같이 사용가능하다
await MainActor.run {
stopLoading.accept(())
}
글 앞부분에 작성했던 코드와 다르게 참조관리를 따로 해 줄 필요가 없고 그로 인해 클로저 내부도 간단해짐
그리고 asyn/await를 쓰게 되면 비동기 코드 작성 할 때부터 코드양이 줄어드는게 눈에 띄는데 그건 다음 포스팅에서...