23.11.03 금

2023. 11. 4. 12:48·Study/🌱 SeSAC

💡 Tableview

✅ itemSelected vs modelSelected

Untitled.pngUntitled.png

tableview의 didSelectRowAt 역할

  • itemSelected → 인덱스 데이터
  • modelSelected → 셀 데이터

두 기능이 따로 작동해서 TableView Delegate의 didSelectRowAt 메서드처럼 한 번에 두 데이터를 받고싶으면 결합을 해야한다.

 

✅ Operator - Observable.zip

Untitled.pngUntitled.png

tableview는 didselectRowAt 기능을 사용하려면 zip을 사용하여 itemSelected와 modelSelected를 결합하여 사용해야 한다.

Untitled.pngUntitled.png

✔️ combineLatest vs zip

2개 이상의 Observable을 결합하여 하나의 Observable을 만든다는 점에서는 비슷하다.

combineLatest

  • 결합 하려는 이벤트가 모두 최소 한 번 emit 되어야 subscribe를 시작한다.
  • emit되는 대로 조합해서 emit

zip

  • emit되는 순서가 같은 observable을 짝 지어서 방출한다.
  • emit시점 보다 몇 번째로 emit 된 것인지가 중요함

Untitled.pngUntitled.pngUntitled.png

 

💡 SearchBar

Untitled.png

SearchBarDelegate에서 제공하는 SearchButtonClicked를 rx에서도 제공한다.

 

Untitled.png

void → search button이 눌렸다는 이벤트가 넘어오기 때문에!

 

Untitled.png

searchBar 리턴 키 입력 시 searchBar의 텍스트를 가지고 오고 싶다!

하지만 searchButtonClicked는 문자열을 리턴하지 않음..

따로 searchBar의 text를 가져와야 한다.

두 방식을 조합해보자

 

✅ Operator - withLatestFrom

Untitled.png

두 가지 Observer를 operator를 통해 연결

버튼 클릭 시 데이터를 넘기고 싶은 경우에 주로 사용한다.

 

액션 이벤트의 반환 값은 무조건 void이다. 때문에 액션 이벤트로 데이터를 가져오고 싶을 때 withLatestFrom을 사용함!!

Untitled.png

withLatestFrom으로 stream이 변경되어 리턴 클릭 시 string을 리턴한다.

 

Untitled.png

data 인스턴스 생성 시점이 더 빨라야 한다.

때문에 셀 데이터는 lazy var로 선언해주자!

 

Untitled.png

items이 onNext 이벤트로 전달이 된다.

items 데이터가 달라지기 때문에 bind가 호출되고, tableview가 reload된다.

tableview의 reloadData를 호출해 줄 필요가 없다!!

 

✅ searchBar로 실시간 검색을 구현한다면..

네트워크 통신 시 실시간 검색은 위험함

콜 수 제한.. 타자 칠 때 마다 통신 요청

Untitled.pngUntitled.pngUntitled.pngUntitled.png

조건을 추가하여 아무것도 검색하지 않았을 때는 모든 데이터 보여주기

 

사용자가 빠르게 입력하면 매번 통신 요청을 하게됨

커서가 멈췄을 때만 요청하도록 구현해보자

 

✅ Operator - debounce

Untitled.png

1초만 기다렸다가 구독

 

 

Monosnap_screencast_2023-11-03_11-33-29.gif

직전 검색 값과 같다면 굳이 같은 데이터를 또 통신 요청할 필요가 없다.

 

✅ Operator - distinctUntilChanged()

Untitled.png

직전 값과 동일하면 무시한다.

→ 실시간 검색 기능 구현 시 과한 호출을 막을 수 있다.

 

💡 Reusable - prepareForReuse

Untitled.pngMonosnap_screencast_2023-11-03_12-12-20.gif

셀을 재 사용하면서 구독이 중첩되는 문제가 발생한다.

prepareForReuse()에서 disposeBag을 새 인스턴스로 갈아끼운다!

 

Untitled.png

재사용 될 때 마다 prepareForReuse에서 cell dispose를 수행하게 된다.

리소스가 정리됨!

 

Monosnap_screencast_2023-11-03_12-20-08.gif

 

💡 Relay

✅Realy 종류

  • BehaviorRelay
  • PublishRelay
  • ReplayRelay

✅ Subject vs Relay

Relay는 Subject와 거의 유사한 특성을 가지고 있다.

차이점

subject - complete와 error이벤트를 받을 수 있다.

relay - next이벤트만 받을 수 있다.

 

Relay는 주로 UI를 구현할 때 사용한다.

UI는 error나 complete 이벤트가 발생하는 경우는 없기 때문에 next 이벤트만 있어도 된다.

이러한 이유로 Relay를 사용한다.

 

Subject를 사용할 때 complete와 error이벤트가 발생하면 dispose를 수행하게 되는데, Realy는 next 이벤트만 존재하기 때문에 disposed가 되기 전까지 subscribe가 해제되지 않는다.

Relay를 사용할 때 dispose에 대한 처리를 고려해야 한다.

 

Relay는 next 이벤트만 처리하기 때문에 next 대신 accept 키워드를 사용한다.

 

subject - observable

relay - driver

Untitled.pngUntitled.png

subject와 사용하는 방법이 유사함

RxCocoa를 import해야 한다.

 

 

'Study > 🌱 SeSAC' 카테고리의 다른 글

DailyPin - 출시 프로젝트 회고  (0) 2023.11.04
23.11.02 목  (0) 2023.11.03
23.11.01 수  (1) 2023.11.01
23.10.31 화  (0) 2023.11.01
23.09.01 금  (0) 2023.09.01
'Study/🌱 SeSAC' 카테고리의 다른 글
  • DailyPin - 출시 프로젝트 회고
  • 23.11.02 목
  • 23.11.01 수
  • 23.10.31 화
김졀니
김졀니
🍎 iOS 개발
  • 김졀니
    졀니의 개발 공부✨
    김졀니
  • 전체
    오늘
    어제
    • 분류 전체보기
      • iOS
        • Swift
        • UIKit&SwiftUI
        • RxSwift&Combine
        • WWDC
      • Study
        • 🚨 TroubleShooting
        • 🌱 SeSAC
  • 블로그 메뉴

    • 홈
    • Github
  • 인기 글

  • 최근 글

  • 태그

    traits
    이미지 캐싱
    FileManager
    kingfisher header
    swift concurrency
    CLLocation
    clipstobounds
    인앱리뷰
    displayPriority
    위치 권한
    mainactor
    observable
    layoutIfNeeded
    wwdc23
    Realm
    @PropertyWrapper
    동시성프로그래밍
    concurrency
    Sendable
    OperationQueue
    Swift
    RxSwift
    ReactorKit
    mapkit
    actor
    Drawing Cycle
    의존성 주입
    ios
    pointfree
    swiftdata
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
김졀니
23.11.03 금
상단으로

티스토리툴바