RxSwift를 사용하게 되면 자주 접하게 되는 subscribe, bind, drive를 비교하여 정리해보자!
1. subscribe
public func subscribe(
onNext: ((Element) -> Void)? = nil,
onError: ((Swift.Error) -> Void)? = nil,
onCompleted: (() -> Void)? = nil,
onDisposed: (() -> Void)? = nil
) -> Disposable {
let disposable: Disposable
if let disposed = onDisposed {
disposable = Disposables.create(with: disposed)
}
else {
disposable = Disposables.create()
}
#if DEBUG
let synchronizationTracker = SynchronizationTracker()
#endif
let callStack = Hooks.recordCallStackOnError ? Hooks.customCaptureSubscriptionCallstack() : []
let observer = AnonymousObserver<Element> { event in
#if DEBUG
synchronizationTracker.register(synchronizationErrorMessage: .default)
defer { synchronizationTracker.unregister() }
#endif
switch event {
case .next(let value):
onNext?(value)
case .error(let error):
if let onError = onError {
onError(error)
}
else {
Hooks.defaultErrorHandler(callStack, error)
}
disposable.dispose()
case .completed:
onCompleted?()
disposable.dispose()
}
}
return Disposables.create(
self.asObservable().subscribe(observer),
disposable
)
}
가장 흔히 접할 수 있고, 기본이라고 생각되는 subscribe!
내부 구현을 보면 알 수 있듯이 onNext, onComplete, onError를 지원하여 다양한 처리가 가능하다.
2. bind
public func bind<Object: AnyObject>(
with object: Object,
onNext: @escaping (Object, Element) -> Void
) -> Disposable {
self.subscribe(onNext: { [weak object] in
guard let object = object else { return }
onNext(object, $0)
},
onError: { error in
rxFatalErrorInDebug("Binding error: \(error)")
})
}
구현부를 살펴보면 subscribe를 사용하여 구현되어 있다.
파라미터로 onNext만을 받아 처리하는것으로 보아 error나 complete와 같은 디테일한 처리까지는 불가능하다.
3. Drive
public func drive(
onNext: ((Element) -> Void)? = nil,
onCompleted: (() -> Void)? = nil,
onDisposed: (() -> Void)? = nil
) -> Disposable {
MainScheduler.ensureRunningOnMainThread(errorMessage: errorMessage)
return self.asObservable().subscribe(onNext: onNext, onCompleted: onCompleted, onDisposed: onDisposed)
}
파라미터로 onNext와 onComplete만을 받아 처리한다. error처리까지는 불가능하다.
drive는 보통 UI를 그릴때 사용되는데 때문에 Main스레드를 통해 동작을 실행한다.
또한 share를 내부적으로 사용하고 있기 때문에 동일한 시퀀스를 공유한다.
share
subscribe를 할 때 마다 새로운 Observable 시퀀스가 생성되지 않고, 하나의 시퀀스에서 방출되는 아이템을 공유해 사용한다.
'iOS' 카테고리의 다른 글
[iOS] UIAlertViewController를 사용할 때 UIAlertAction의 handler가 초기화되는 현상 (0) | 2024.03.24 |
---|---|
[iOS] Coordinator Pattern (1) | 2024.02.14 |
[iOS/RxSwift] Merge, CombineLatest, Zip 비교하기 (0) | 2024.01.20 |
[iOS] NIB View 생성자로 인스턴스 생성하기 (BaseView, 클린코드 독후감..) (1) | 2023.11.27 |
[iOS] CollectionView Pagination과 Kingfisher로 이미지 캐싱(Kakao Search Image API) (0) | 2023.10.24 |
RxSwift를 사용하게 되면 자주 접하게 되는 subscribe, bind, drive를 비교하여 정리해보자!
1. subscribe
public func subscribe(
onNext: ((Element) -> Void)? = nil,
onError: ((Swift.Error) -> Void)? = nil,
onCompleted: (() -> Void)? = nil,
onDisposed: (() -> Void)? = nil
) -> Disposable {
let disposable: Disposable
if let disposed = onDisposed {
disposable = Disposables.create(with: disposed)
}
else {
disposable = Disposables.create()
}
#if DEBUG
let synchronizationTracker = SynchronizationTracker()
#endif
let callStack = Hooks.recordCallStackOnError ? Hooks.customCaptureSubscriptionCallstack() : []
let observer = AnonymousObserver<Element> { event in
#if DEBUG
synchronizationTracker.register(synchronizationErrorMessage: .default)
defer { synchronizationTracker.unregister() }
#endif
switch event {
case .next(let value):
onNext?(value)
case .error(let error):
if let onError = onError {
onError(error)
}
else {
Hooks.defaultErrorHandler(callStack, error)
}
disposable.dispose()
case .completed:
onCompleted?()
disposable.dispose()
}
}
return Disposables.create(
self.asObservable().subscribe(observer),
disposable
)
}
가장 흔히 접할 수 있고, 기본이라고 생각되는 subscribe!
내부 구현을 보면 알 수 있듯이 onNext, onComplete, onError를 지원하여 다양한 처리가 가능하다.
2. bind
public func bind<Object: AnyObject>(
with object: Object,
onNext: @escaping (Object, Element) -> Void
) -> Disposable {
self.subscribe(onNext: { [weak object] in
guard let object = object else { return }
onNext(object, $0)
},
onError: { error in
rxFatalErrorInDebug("Binding error: \(error)")
})
}
구현부를 살펴보면 subscribe를 사용하여 구현되어 있다.
파라미터로 onNext만을 받아 처리하는것으로 보아 error나 complete와 같은 디테일한 처리까지는 불가능하다.
3. Drive
public func drive(
onNext: ((Element) -> Void)? = nil,
onCompleted: (() -> Void)? = nil,
onDisposed: (() -> Void)? = nil
) -> Disposable {
MainScheduler.ensureRunningOnMainThread(errorMessage: errorMessage)
return self.asObservable().subscribe(onNext: onNext, onCompleted: onCompleted, onDisposed: onDisposed)
}
파라미터로 onNext와 onComplete만을 받아 처리한다. error처리까지는 불가능하다.
drive는 보통 UI를 그릴때 사용되는데 때문에 Main스레드를 통해 동작을 실행한다.
또한 share를 내부적으로 사용하고 있기 때문에 동일한 시퀀스를 공유한다.
share
subscribe를 할 때 마다 새로운 Observable 시퀀스가 생성되지 않고, 하나의 시퀀스에서 방출되는 아이템을 공유해 사용한다.
'iOS' 카테고리의 다른 글
[iOS] UIAlertViewController를 사용할 때 UIAlertAction의 handler가 초기화되는 현상 (0) | 2024.03.24 |
---|---|
[iOS] Coordinator Pattern (1) | 2024.02.14 |
[iOS/RxSwift] Merge, CombineLatest, Zip 비교하기 (0) | 2024.01.20 |
[iOS] NIB View 생성자로 인스턴스 생성하기 (BaseView, 클린코드 독후감..) (1) | 2023.11.27 |
[iOS] CollectionView Pagination과 Kingfisher로 이미지 캐싱(Kakao Search Image API) (0) | 2023.10.24 |