Connect 개발 회고 (3)

이건준·2022년 8월 15일
0

1. 알게된 부분

1. didSet의 동작

  • 원래 didSet은 프로퍼티의 Set하는 과정을 지켜보고있다가 이행 시에 해당 블록의 코드를 실행하는것으로 알고있었다, 그래서 나는 이번 Connect개발과정에서 FloatingPanel의 Init메소드를 통해 데이터를 넘겨주었고 이 데이터의 값의 존재여부에 따라 EmptyView의 isHidden값을 결정해주기로 하였다
	private var kakaoAddressResults: [KakaoMapAddress] = [] {
        didSet {  
            print("aaafsfsa")
            if kakaoAddressResults.isEmpty { 
                print("empty")
                self.emptyView.isHidden = false
            } else {
                print("empty!!!")
                self.emptyView.isHidden = true
            }
        }
    }
  • 위 코드처럼 didSet을 사용해주었는데 EmptyView가 원하는 방식대로 동작이 되지않는 현상이 계속 되었고 콘솔에 isEmpty값을 확인해보았지만 잘못된 점을 찾지못하였다
  • 그러다가 처음 알게 된 부분이

    didSet은 Init메소드를 통해 받아온 데이터에 의해 동작하지않고 그 이후에 해당 프로퍼티를 건들었을 경우에만 동작을 하는것이였다

2. RxSwift의 결합연산자 활용법

  • 나는 Reactor를 이용하여 View에 데이터를 뿌려주는 부분에서 각 View를 위한 State의 데이터 하나씩을 map을 이용하여 하나하나 코드해주었다
  • 헌데 이번 지도화면 중 지역검색에 따른 결과를 FloatingPanel에 띄어줄때 값이 존재하지않을때 그냥 빈 화면만 띄어지는 부분이 어색하다느껴 State값에 isEmpty프로퍼티를 추가하게 되었고 State에서 총 2개의 데이터를 FloatingPanelVC에 넘겨줘야하는 상황이 생겼다
  • 위와 같은 경우에 map을 이용해선 해결이 되지않는 문제였고 많이 사용해보지못하였던 결합연산자에 대해 알게되는 계기가 되었다
Observable.combineLatest(reactor.state.map{ $0.addressResult }.skip(1), reactor.state.map{ $0.isEmpty })
            .observe(on: MainScheduler.instance)
            .subscribe(onNext: { [weak self] kakaoAddresses, isEmpty in
                guard let `self` = self else { return }
                let contentViewController = MapFloatingPanelViewController(floatingType: .searchResult, kakaoAddressResults: kakaoAddresses)
                contentViewController.checkEmpty(isEmpty: isEmpty)
                self.showFloatingPanel(contentViewController: contentViewController, self.floatingPanelVC)
            })
            .disposed(by: disposeBag)
  • 앱을 실행하고난 바로 의도치않은 addressResult에 의해 올라오는 FloatingPanel을 없애주기위해 skip연산자를 이용하였고
  • 앞서 말한 2개의 데이터를 이용하기위해 결합연산자인 CombineLatest를 통해 뿌려주었다

0개의 댓글