짧은인사, 하루의 사건, 나의 행동
ToDo
✅ Rx음미
후.. 마지막 작성일이 07.08 입니다 ㅋㅋ,,,,.,.,. 그동안 많은 일들이 있었습니다..
3월부터 시작한 멋사 iOS 앱스쿨이 9월 추석전에 끝났습니다..허허 6개월간 많은걸 배웠네요 (오늘 글은 이 부트캠프 후기 아님! 후기도 안쓸거임!)
것보다 요즘 취업준비를 한창 하고있습니다만,, 자격요건이나 우대사항에 RxSwift나 Combine등등이 많이 있더라구요
그래서~~ rx를 공부를 시작한건 아니고.. 마지막 프로젝트에서 MVVM패턴을 채택해 팀원들과 개발을 했었는데,,
MVVM으로 안만들고 유사 MVP패턴으로 개발을 했었걸랑여 ^_^ 그래서 리팩토링을 하기 전에 제가 스킬업을 해야 조금더 좋은 코드를 작성하고 팀이 채택했던 패턴으로 진행할수있을것 같았어요,,,,훠훠
아 또있다.
그 RxSwift를 공부하기전에 사실 Combine을 먼저 배우고 하려했는데, 핑계를 대보자면,, 다른분들의 설명을 보아도 RxSwift를 알고있다는 기반으로 설명을 많이들 하시더라구요 그래서 저도 가족이 되고자 공부를 시작했습니다 ^_^
(아직 많이 한건 아니니까 그냥 읽으쇼)
배운점
자료를 찾아보면 RxSwift를 Cocoapods를 사용해서 먼저 프로젝트를 만들더라구요. 그래서 저도 오랜만에 pod init으로 pod파일을 만들어 보려 했지만!
Searching for inspections failed: undefined method `map' for nil
터미널에 위와같은 경고를 보여주며.. pod init을 하지도 못한채 3시간쯤을 이 에러 해결을 위해 힘썼습니다..
그래서 해결했냐구요? 아니요.. 이것저것 깃 이슈들을 들추면서 코코아팟 재설치 뭐 루비 재설치 등등 brew까지 재설치했었어요 ㅎㅎ
하지만 안되더라구요..?
pod install을 해서 워크스페이스 파일까지 만들었지만 워크스페이스안의 프로젝트가 보여지지않았고,, 터미널에 비슷한 경고 메세지를 보여줬었네요..
pod install로 안되면 뭐 어쩌겠습니까 ㅋ
그래서 저는 SPM을 사용해서 RxSwift를 적용했습니다.
다시 RxSwift로 돌아와서.
RxSwift 사용 이유
가장 먼저 RxSwift를 사용해야 하는 이유는 뭘까요??
저는 일단 스킬업을 하기위해서,,, 는 아니구 제가 아직 응용까진 많이 해보진 않았지만 코드가 깔끔해진다는 장점이 있었던것 같아요,
예를들어 뭐 delegate나 NotificationCenter를 사용하지 않아도 되니까 ㅎㅎ
찾아보니 사용 이유는
- 명확하고 명시적으로 비동기 데이터를 처리한다.
- 코드가 깔끔해지고 스레드 관리가 용이해진다.
- TDD에 적용하기 좋다.
정도가 있는것 같습니다.
주요 개념
ReactiveX의 사이트에 들어가보시면 Docs의 카테고리는
Observable, Operator, Single, Subject, Scheduler로 총 5개로 나누어져 있더라구요.
물론 다 알면 좋지만 저는 Observable, Operator, Subject를 주로 학습했습니다.
Observable
관찰 가능한 데이터 스트림인 Observavle입니다. 스트림은 하나의 흐름? 파이프? 라고 생각을 했습니다.
이벤트를 내보내고, 해당 이벤트에 반응하는 Observer가 그 이벤트를 처리합니다.
Observer
관찰자인 Observer 입니다. Observer는 Observable를 구독(Subscribe)하여 데이터 스트림을 감지하고,
새로 방출되는 값을 받아 처리합니다.
Operator
연산자인 Operator는 데이터 스트림을 필터링 하는데 사용됩니다.
Operator Docs 에 보시면 정말 많은 연산자들이 있습니다.
위 사이트의 "A Decision Tree of Observable Operators" 을 보시게 되면 어떠한 상황에서 사용해야할 연산자들을 알려주고 있습니다.
굉장히 친절하죠??
제가 간단하게 실습해본 연산자의 코드를 보여드리겠습니다.
@IBAction func exJust() {
Observable.just(["Hello", "World"])
.subscribe(onNext: { arr in
print(arr)
})
.disposed(by: disposeBag)
// ["Hello", "World"]
}
위의 코드는 "just" 연산자를 보여주는 코드 입니다.
Doc에선 just와 같은 연산자들을 "Creating Observables" 이라 칭하고 새로운 Observable을 만드는 연산자 라고 합니다.
@IBAction func exFrom1() {
Observable.from(["RxSwift", "In", "4", "Hours"])
.subscribe(onNext: { str in
print(str)
})
.disposed(by: disposeBag)
// RxSwift
// In
// 4
// Hours
}
위의 코드는 Creating Observables중 하나인 from 입니다.
똑같이 구독하여 print했지만 just는 ["Hello", "World"]를 출력하고 from은 한줄씩 출력되고 있습니다.
이 둘의 차이는 뭘까요? just는 모두생성 from은 한개씩 생성하는걸까요?
이는 docs의 마블 다이어그램을 보시면 이해가 됩니다.
뭐 print의 출력값으로 대강 예상을 했지만 doc에서도 이 차이를 알려주고 있습니다.
Just는 From과 비슷하지만, From은 배열이나 이터러블 등으로 들어가서 항목을 가져오는 반면, Just는 배열이나 이터러블 등을 변경하지 않고 단일 항목으로 그대로 방출한다는 점에 유의하세요.
이처럼 Docs를 보며 간단하게 연산자를 공부해보았습니다.
이외에도 위는 just와 from은 생성 연선자 이고,
생성 이외의 변환, 필터링, 결합, 유틸리티 등등 여러개의 연산자가 있습니다. 시간날때 들려서 확인하세요 ㅎㅎ
(맨밑의 git에 간단하게 많이 사용한다던 연산자를 정리해두었습니다.)
DisposeBag
RxSwift에서 Observable을 구독하고 난 뒤 더이상 필요하지 않으면 구독을 해제해야 합니다.
DisposeBag에 dispose들을 담아 메모리 누수를 방지합니다.
var disposeBag: DisposeBag = DisposeBag()
@IBAction func onLoadImage(_ sender: Any) {
imageView.image = nil
let disposable = rxswiftLoadImage(from: LARGER_IMAGE_URL)
.observeOn(MainScheduler.instance)
.subscribe({ result in
switch result {
case let .next(image):
self.imageView.image = image
case let .error(err):
print(err.localizedDescription)
case .completed:
break
}
})
.disposed(by: disposeBag)
// disposeBag.insert(disposable)
}
@IBAction func onCancel(_ sender: Any) {
// TODO: cancel image loading
disposeBag = DisposeBag()
}
후기
오늘은 여까증 작성해볼게요.. 진짜 신기한게 document나 유튜브 영상으로 해당 개념을 학습하고, 그 지식을 바탕으로 응용 코드를 작성해보고, 블로그 작성까지 해가면 개념이 더욱 머리에 잘들어오네요 훠훠.
간단한 응용코드를 작성했는데, API사용이나 MVVM패턴에 적용 등등을 더욱 학습해와 다시 포스트를 해보겠습니다 ^^
이후 예고를 하자면 rx가 끝나면 Pin&Flex Layout을 맛볼게요 ㅎㅎ
참고: https://www.youtube.com/watch?v=w5Qmie-GbiA&t=7577s
github: https://github.com/jjwon2149/RxSwift/blob/main/RxPrac/RxPrac/ViewController.swift
'TIL' 카테고리의 다른 글
TIL-Vapor 맛보기 (1) | 2025.01.16 |
---|---|
TIL_20240119 iOS)CoreData로 부숴지기.. CRUD (0) | 2024.01.19 |
TIL_20240116 iOS에서 데이터를 저장하는 방법 (0) | 2024.01.16 |
TIL_20240110 Swift_AppSandbox, NSCoder (0) | 2024.01.10 |
TIL_20240109 Swift_SingletonPattern (0) | 2024.01.09 |