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 | 31 |
Tags
- 명품cppProgramming c++
- RaceCondition
- 청년취업사관학교
- DispatchQueue
- gitflow
- GIT
- swift
- 오픈채팅방
- data_structure
- SwiftUI
- rxswift
- MainScheduler.asyncInstance
- MethodSwilzzling
- Realm
- MainScheduler.Instance
- SRP
- SeSAC
- GCD
- 코테
- IOS
- cleanarchitecture
- CoreBluetooth
- DiffableDataSource
- DynamicMemberLookup
- MainScheduler
- DependencyInjection
- combine
- leetcode
- 등굣길
- 프로그래머스
Archives
- Today
- Total
Do.
Swift - RxSwift의 withUnretained를 Combine에서도 쓰기 본문
개요
RxSwift나 Combine 등에서 subscribe에서 escaping closure를 다룰 시 필연적으로 캡처 리스트를 통해 약한 참조를 해야할 때가 있습니다. 아주 지긋지긋 하죠? Xcode 14.3(swift 5.8) 이후 부터는 weak self를 바인딩 한번 한 이후 부터는 self를 붙일 필요가 없긴 합니다만.. 바인딩 코드를 작성하는 것도 매우 귀찮은 일..
이를 RxSwift(6.0)에서는 withUnretained라는 설탕 문법이 있습니다.
observerble
.withUnretained(self)
.subscribe { (owner, output) in
owner.value = output
}
.dispose()
요 편리한 코드를 그대로 Combine에서 써볼려고 합니다.
구현
구현 방식은 각자 다를 것 같은데 원리는 비슷할 것 같아요!
extension Publisher {
func withUnretained<O: AnyObject>(_ owner: O) -> Publishers.CompactMap<Self, (O, Self.Output)> {
compactMap { [weak owner] output in
owner == nil ? nil : (owner!, output)
}
}
}
요렇게 Publisher의 Extension으로 작성합니다.
내용은 심플하게 compactMap을 래핑한 Transform으로 해보았습니다.
이번 경우는 owner에 문제가 생기면 값 자체가 nil로 들어오는 패턴이고 좀더 응용을 해본다면 Error를 발생시키는 식으로 해볼 수 있을 것 같네요!
useCase
.value
.withUnretained(self)
.sink { (owner, output) in
owner.currentValue = output
}
.store(in: &cancelablles)
위 처럼 self에 대한 바인딩 없이 subscriber를 자유롭게 사용할 수 있습니다.
'iOS' 카테고리의 다른 글
WWDC23 - What's new in swift (0) | 2023.06.07 |
---|---|
RxSwift - MainScheduler.instance vs MainScheduler.asyncInstance (0) | 2023.06.02 |
iOS Framework - 네트워크 모듈 테스트 (URLSession, Unit Test) (2) | 2023.03.31 |
SwiftUI - SwiftUI 환경에서 ViewController Life Cycle 사용하기 (6) | 2022.10.26 |
Swift - 지금 보는 뷰 이름 알기 (2) | 2022.09.04 |
Comments