EEYatHo 앱 깎는 이야기

Swift ) weak 를 못쓰게되면서.. (with Rx vs Combine) 본문

iOS, Swift/Tip, Bug, Swift Error

Swift ) weak 를 못쓰게되면서.. (with Rx vs Combine)

EEYatHo 2023. 8. 22. 00:15
반응형

개요


UIKit 에 RxBus 를 사용하던 프로젝트를, SwiftUI + TCA 로 컨버팅하면서 발생한 일.


SwiftUI.View 가 struct 라 내부 closure 에 weak self 를 사용할 수 없음.

TCAreducer 도 struct 로 제공 중.

 

기 사용중이던 RxBus 는 Rx를 통해 전역 이벤트를 수신해야함.

해당 과정에서 weak를 사용하지 못하기에, self 를 강한참조하여 메모리 릭 발생..

 

 

 

해결 과정 & Solution


  1. SwiftUI(struct) 에서, 비동기 First Party인 NotificationCenter를 어떻게 사용하는지 탐구.
    -> Combine을 사용하여 수신하는 것을 발견.
    -> RxBus 이벤트를 받으면 Combine publisher를 sink하는 식으로 해보니, 메모리 릭 해결됨(?)


  2. Rx와 Combine의 차이점을 탐구.
    -> DisposeBag는 class이고 Set<Anycancllable>은 struct이기 때문에, 차이점이 발생하는 것을 깨달음.

    2-1. Rx 의 소유 관계 :
    View -> DisposeBag -> Diposable -> Closer -> [strong self] View -> DisposBag
    DisposeBagclass 이기 때문에, 두 DisposeBag 는 같은 인스턴스.
    즉, 처음 View를 제외하고 나머지 요소들이 Retain Cycle 발생

    2-2. Combine 의 소유 관계 :
    View -> Set<AnyCancellable> -> AnyCancellable -> Closer -> [strong self] View -> Set<AnyCancellable>
    Set<AnyCancelable>는 struct. 처음 나온 Set<AnyCancelable>과 다른 객체.
    Retain Cycle 발생하지 않음

 

 

 

Solution


해당 차이점을 인지하고, 캡처 리스트 학습.

-> 최종 해결 방법 탐구.

 

View -> DisposeBag -> Diposable -> Closer -> [store = self.store]

필요한 객체인 self.store 만 closure 에서 캡처하여 해결. ( Combine 사용하지 않고 해결 )

Comments