일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 드로어블
- 상대 레이아웃
- 테이블_레이아웃
- textview auto scroll
- edwith
- 스낵바
- 코드리뷰
- 프로젝트
- 뷰
- 텍스트뷰 자동 스크롤
- SceneDelegate
- 레이아웃
- 서비스
- IOS
- 코틀린
- 안드로이드
- 자바
- 아이폰
- 제약 레이아웃
- RecyclerView
- 텍스트뷰 스크롤
- 리니어 레이아웃
- 액션바
- 안드로이드_프로그래밍
- 수명주기
- 데이터베이스
- 부스트코스
- 안드로이드 스튜디오
- 프로그래밍
- Swift
- Today
- Total
듀다의 성장개발로그
iOS) Swift에서의 비동기 작업, 그리고 RxSwift(1) 본문
앱에서 몇 가지 동작을 동시에 처리하는 경우, 요청과 결과가 동시에 일어날 수도 있고 요청한 그 자리에서 결과가 일어나지 않을 수도 있습니다.
이 중 요청과 결과가 동시에 이루어지지 않는 작업을 '비동기 작업'이라고 하는데요,
Swift에서는 비동기 작업 처리를 위해 DispatchQueue.async를 활용할 수 있습니다.
실행하려는 비동기 작업이 무조건 메인 스레드에서 동작하게 하려면 DispatchQueue.main.async를 활용할 수 있습니다.
DispatchQueue.main.async { //anything you want }
우선순위에 따라 백그라운드에서 동작하게 하고 싶을 때는 DispatchQueue.global()을 활용할 수 있습니다.
DispatchQueue.global().async { //anything you want }
동기 작업은 async 대신 sync를 써서 같은 방법으로 만들 수 있지만 주의해야 할 점이 한 가지 있습니다.
Dispatch.main에서는 sync를 호출하지 말아야 한다는 것인데요, Dispatch.main에서 sync를 호출하면 Deadlock(둘 이상의 작업이 상대가 끝나기만을 기다려서 아무것도 할 수 없는 상태)이 발생할 수 있습니다.
둘의 사용 방법은 비슷하지만 실제로 실행되는 방식에 차이가 있기 때문에 발생하는 문제입니다. async는 위에 설명했듯 요청한 그 자리에 결과가 일어나지 않으며, 결과가 일어나기 전까지 다른 작업을 할 수도 있습니다.
하지만 sync는 요청에 대해 결과를 받은 후에야 다음 작업을 실행하기 때문에 Deadlock이 발생하게 됩니다.
그렇지만 DispatchQueue만을 가지고 비동기 작업을 처리하려 하면, 매번 DispatchQueue를 호출해야 하기 때문에 작업이 많아질 경우 코드가 복잡해질 수 있습니다.
이럴 때 DispatchQueue 대신 클로저를 사용할 수도 있지만,
클로저 대신 리턴값으로 결과를 받을 수는 없을까요?
비동기 작업에선 즉시 결과가 나오지 않기 때문에 나중에 데이터가 오면 처리하는 방식으로 코드를 짜려 하는데, 나중에 오는 그 결과를 리턴값으로 받을 수는 없느냐는 것이지요.
이때 활용할 수 있는 것이 RxSwift의 Observable입니다.
Observable에 나중에 데이터가 오면 그것을 처리하기 subscribe라는 메소드를 활용합니다.
RxSwift에서 subscribe는 들어오는 데이터를 계속해서 참조하는 메소드로 Subscribe는 구독이라는 단어로 번역이 됩니다.
구독! 좋아요! 할때의 그 구독과 완전히 같은 개념은 아니지만 채널을 구독하면 새로운 것이 올라올 때마다 알 수 있듯
무언가 지켜보고 있다는 개념을 연상하시면 됩니다.
RxSwift는 Swift에서 MVVM 모델을 만들 때 많이 사용됩니다.
MVVM은 모델(Model) - 뷰(View) - 뷰 모델(View Model)의 구조로 이루어져 있습니다.
뷰 모델은 모델의 데이터를 받아 뷰에 나타내기 좋은 형태로 반환하며 뷰가 이를 표시합니다.
RxSwift를 가지고 MVVM을 만드는 예제는 다음 포스팅에서 다루도록 하겠습니다.