Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Notification
- 개발자
- UIButton
- Firebase
- IOS
- Realm
- SwiftUI
- appstore
- Git
- 웹뷰
- error
- JPA
- window
- view
- github
- stack
- mac
- Python
- FLUTTER
- Session
- rxswift
- Xcode
- 한글
- Apple
- Archive
- Swift
- MacOS
- darkmode
- Code
- iOS16
Archives
- Today
- Total
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 를 사용할 수 없음.
TCA 의 reducer 도 struct 로 제공 중.
기 사용중이던 RxBus 는 Rx를 통해 전역 이벤트를 수신해야함.
해당 과정에서 weak를 사용하지 못하기에, self 를 강한참조하여 메모리 릭 발생..
해결 과정 & Solution
- SwiftUI(struct) 에서, 비동기 First Party인 NotificationCenter를 어떻게 사용하는지 탐구.
-> Combine을 사용하여 수신하는 것을 발견.
-> RxBus 이벤트를 받으면 Combine publisher를 sink하는 식으로 해보니, 메모리 릭 해결됨(?) - Rx와 Combine의 차이점을 탐구.
-> DisposeBag는 class이고 Set<Anycancllable>은 struct이기 때문에, 차이점이 발생하는 것을 깨달음.
2-1. Rx 의 소유 관계 :
View -> DisposeBag -> Diposable -> Closer -> [strong self] View -> DisposBag
DisposeBag은 class 이기 때문에, 두 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 사용하지 않고 해결 )
'iOS, Swift > Tip, Bug, Swift Error' 카테고리의 다른 글
SwiftUI ) TCA 단점 ( with AsyncStream, cancel, cancelable ) - EEYatHo iOS (1) | 2024.02.01 |
---|---|
SwiftUI ) 위아래 검은 패딩 - EEYatHo iOS (0) | 2023.10.07 |
Swift ) Moya Interceptor, Plugin - EEYatHo iOS (0) | 2023.07.27 |
Swift ) 앱 종료 감지, 지연 applicationWillTerminate - EEYatHo iOS (0) | 2023.06.30 |
Swift ) NSURLErrorDomain Code=-1103 - EEYatHo iOS (0) | 2022.11.10 |
Comments