✅ 15 버전 업데이트 사항
에셋에 있는 리소스 사용 시 .이름 으로 사용할 수 있다.
편해짐!
ui 프리뷰
💡 RxSwift
✅ UISwitch 구현하기
UIKit 방식 구현
RxSwift로 구현
observable이 bool 상태를 전달하여 Observer가 스위치 상태를 변경
→ Observable
값을 생성하고, 전달한다.
→ Observer
받은 데이터를 기반으로 상태를 변경한다.
만약, 2초 후에 데이터를 변경하고 싶다면?
isOn 값을 바꿔주면 변경된 값이 반영되게 해야한다.
observable은 데이터를 전달하는 것만 가능하고, 이벤트를 받아 처리할 수는 없다.
✅ Observable과 Observer
이벤트를 전달하는 observable과 이벤트를 처리하는 observer
Observable과 Observer를 통해 stream을 통제하고, operator(just, of, take..)를 통해 stream을 변경, 조작할 수 있다.
Observable은 subscribe를 하지 못하기 때문에 이벤트를 방출만 할 수 있고, 이벤트 처리는 하지 못한다. → onNext 메서드 사용이 불가능하다.
값을 변경하는 등 Observer의 역할도 할 수 있는 Subject가 있다.
✅ Subject
종류
- PublishSubject
- 초기 값이 없는 빈 상태로 시작
- BehaviorSubject
- 초기 값 필수
- ReplaySubject
- AsyncSubject
✔️ BehaviorSubject
자기가 가지고 있는 데이터를 변경한다. → observable이 Observer의 역할도 수행
subscribe 이전에 emit한 이벤트가 있다면, 가장 최근에 전달된 이벤트 하나를 전달받을 수 있다.
없다면 초기값 전달
.onNext를 통해 값 변경 이벤트 전달
데이터를 감지하고 있다가 변경이 되면 switch의 상태를 변경해준다.
rxcocoa의 isOn 메서드를 사용하여 스위치 값을 간단하게 처리한다.
✔️ publishSubject<>()
- 초기 값을 가지고 있지 않다.
let isOn = PublishSubject<Bool>()
isOn.onNext(true)
: onNext로 default 값 설정
이벤트 전달 순서
구독하기 전에 이벤트를 전달하였기 때문에 이벤트를 받지 못한다.
구독한 후 이벤트를 전달해야 한다.
publishSubject의 특징
- subscribe 이후 시점부터 emit되는 이벤트를 처리할 수 있다.
- subscribe 이전에 emit된 이벤트는 무시된다.
✅ 조건에 만족할 때 버튼 활성화 하기
✅ onNext vs on
on메서드는 이벤트 타입을 직접 지정해야 하는 메서드
onNext는 next 이벤트를 바로 사용 가능한 메서드
💡 메모리 누수 처리
✅ withUnretained(self)
withUnretainted(self) - weak self의 기능을 한다.
메모리 누수를 처리하기 위한 메서드
.withUnretained(self)
호출 후 subscribe를 호출하면
onNext의 매개변수에 ViewController가 포함된다.
object를 사용하여 self에 대한 메모리 누수 문제를 해결할 수 있다.
✅ .subscribe(with: onNext: )
subscribe 메서드 내에 with 매개변수가 포함된 메서드가 있다.
withUnretained와 같은 기능
주로 owner라는 이름을 사용한다.
✅ Subscribe vs Bind
✔️ observe(on: MainScheduler.instance)
만약 서버 통신을 사용하여 백그라운드로 동작하고 있을 때,
ui 관련 코드를 main thread에서 동작할 수 있도록 정의
bind는 메인 스레드에서 동작한다.
subscribe는 ui를 다룰 때 메인 스레드에서 동작할 수 있도록 스레드를 지정해줘야 한다.
🚨 오류 조심하기!
observable은 보내기만 하기 때문에 이벤트에 대한 어떠한 것도 핸들링이 되지 않는다.
때문에 next 이벤트 처리가 불가능하기 때문에 오류가 발생한다.
observable도 이벤트를 받아서 처리하고 싶다면 subject를 사용해야 한다.
Observable은 값을 생성하여 초기화 하고 전달하는 역할만 수행!!
✅ .dispose()
즉시 리소스를 정리하여 구독을 해제한다.
때문에 한 번 수행하고 그 이후에는 실행이 되지 않는다.
화면이 나타남과 동시에 리소스 정리
주로 구독을 한 후 화면이 떠있는 동안 사용하기 때문에 더이상 필요하지 않을 때 dispose 하는 것이 바람직 함
**.disposed(by: disposeBag)**을 사용
날짜 차이 구하기
func getAge(birthday: Date) -> Bool {
let age = Calendar.current.dateComponents([.year], from: birthday, to: Date())
return Int(age.year!) >= 17
}
dateComponents 메서드 중 from과 to를 받는 메서드를 사용하면 두 날짜의 차이를 계산할 수 있음
'iOS > 🌱 SeSAC' 카테고리의 다른 글
23.11.03 금 (1) | 2023.11.04 |
---|---|
23.11.02 목 (0) | 2023.11.03 |
23.10.31 화 (0) | 2023.11.01 |
23.09.01 금 (0) | 2023.09.01 |
23.08.31 목 (0) | 2023.09.01 |