iOS/Reactive Programming in iOS

[RxSwift] .subscribe { }와 .subscribe(onNext: { })의 차이

TDCIAN 2024. 3. 14. 10:16

 

// .subscribe { }
Observable.just("Tell me something~")
	.subscribe { (string: Event<String>) in
		print(string.element) // Optional("Tell me something~")
	}
	.disposed(by: self.disposeBag)

    
// .subscribe(onNext: { })
Observable.just("Tell me something!")
	.subscribe(onNext: { (string: String) in
		print(string) // Tell me something!
	})
	.disposed(by: self.disposeBag)

 

Q. '.subscribe { }' 형태와 '.subscribe(onNext: { })' 형태의 차이를 설명해 줘

 

A. '.subscribe { }' 형태와 '.subscribe(onNext: { })' 형태의 차이에 대해 설명하겠습니다.

 

1. .subscribe { } 형태:

- 이 형태는 단순히 Observable이 방출하는 모든 이벤트에 대한 구독을 나타냅니다. 이벤트 종류에 관계없이 모든 종류의 이벤트(Next, Error, Completed)에 대한 핸들러가 제공됩니다. 따라서, '.subscribe' 클로저 내부에서는 'Event' 타입의 파라미터를 받아들이고, 해당 이벤트에 대한 처리를 수행합니다.

 

2. .subscribe(onNext: { }) 형태:

- 이 형태는 오직 Next 이벤트에 대해서만 구독하고자 할 때 사용됩니다. 따라서, 이 형태의 '.subscribe' 클로저는 'onNext' 파라미터를 가지며, Next 이벤트가 발생했을 때 호출됩니다. 이벤트 핸들러 내부에서는 Next 이벤트의 값을 받아들이고 해당 값을 이용하여 처리를 수행합니다. Error나 Completed 이벤트에 대한 핸들링은 구현되어 있지 않습니다.

 

따라서, '.subscribe { }' 형태는 모든 종류의 이벤트에 대한 구독을 하고, 'subscribe(onNext: { })' 형태는 오직 Next 이벤트에 대한 구독만을 수행합니다. 필요에 따라 선택하여 사용할 수 있습니다.

 

Q. 메모리 누수의 발생 가능성은 둘 중 어느것이 더 높아?

 

A. 두 가지 형태의 'subscribe' 모두 메모리 누수의 발생 가능성은 비슷합니다. 그러나 일반적으로 '.subscribe { }' 형태보다는 '.subscribe(onNext: { })' 형태가 메모리 누수의 발생 가능성이 더 낮습니다.

 

'.subscribe { }' 형태는 모든 종류의 이벤트에 대한 핸들러를 제공하므로, 만약 오류나 완료 이벤트가 발생하지 않고 계속해서 Next 이벤트만 발생하는 Observable에 대해 구독할 경우에는 문제가 되지 않습니다. 그러나 만약 Observable이 에러나 완료 이벤트를 발생시키지 않고 종료되지 않는 경우, 구독이 영원히 계속되어 메모리 누수가 발생할 수 있습니다.

 

반면에, '.subscribe(onNext: { })' 형태는 오직 Next 이벤트에 대해서만 구독하므로, Observable이 에러나 완료 이벤트를 발생시키더라도 Next 이벤트에 대한 구독만을 수행합니다. 이는 메모리 누수의 가능성을 줄일 수 있습니다.

 

따라서, 메모리 누수의 발생 가능성을 최소화하기 위해서는 가능한한 'subscribe(onNext: { })' 형태를 사용하는 것이 좋습니다.

 

 

정보 출처: ChatGPT

'iOS > Reactive Programming in iOS' 카테고리의 다른 글

[RxSwift] RxSwift 왜 써야 하나요?  (0) 2022.05.08