티스토리 뷰

Mobile/iOS

RxSwift DisposeBag

out of coding 2018. 6. 13. 15:15

RxSwift의 메모리 관리에 대해서 이야기해보려고 합니다.


우리가 프로그램을 만들면 모든 메모리는 무한정 사용할 수 있는것이 아닙니다.


그래서 메모리를 관리를 해줘야하는데요.


일반적으로 객체를 만들고 그것을 다 사용하고 해제가 된다고 생각되면 deinit이 발생하고 그곳에서 객체의 마지막을 정리해주면 됩니다.


RxSwift를 짜는 개념상 메모리에 붕붕 떠서 다닐수 밖에 없는 상태가 생깁니다.

예를 들자면 다음과 같은 코드를 보시죠.


1
2
3
4
5
observable
    .map { $0.isEmpty }
    .subscribe(onNext: {
        // brabra
    })
cs


이렇게 선언한 녀석은 return으로 Disposable을 생성합니다.


Disposable은 어떻게 되어 있느냐...


1
2
3
public protocol Disposable {
    func dispose()
}
cs


이러한 형태의 protocol로 구현이 되어 있습니다.


단순히 저것을 이용하는 방법을 생각해보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
final class RxViewController: UIViewController {
 
    private var subscription: Disposable?
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
        subscription = observable
            .map { $0.isEmpty }
            .subscribe(onNext: {
                // brabra
            })    
    }
 
    deinit {
        subscription?.dispose()
    }
}
cs


이렇게 한개가 선언되어 있을 경우에는 메모리에서 날아갈수 있도록 구현이 가능합니다.


그렇다면 선언할게 많다면?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
final class RxViewController: UIViewController {
 
    private var subscriptions: [Disposable] = []
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
        subscriptions.append(observable
            .map { $0.isEmpty }
            .subscribe(onNext: {
                // brabra
            }))
    }
 
    deinit {
        subscriptions.forEach { $0.dispose() }
    }
}
cs


배열에 넣어서 처리가 가능합니다.


이건 아주 예전에 사용하던 방법이고요. 그래서 나왔습니다. DisposeBag!

요즘은 다 이렇게 짭니다.


이것이 무엇이냐면 


https://github.com/ReactiveX/RxSwift/blob/master/RxSwift/Disposables/DisposeBag.swift


Disposable를 extension 한것이고. 이 DisposeBag에 insert 합니다.


이후에 메모리에서 해제가 되었을 경우에 이것을 가지고 자동으로 해제를 시켜줍니다.


내부 코드를 보게 된다면 제가 위의 두개 코드를 올려둔 부분과 거의 흡사한 부분이 보이실겁니다.



deinit이 된다면 자동으로 dispose를 불러서 사용할수 있게 말이죠.


개념을 알고 사용하면 더 재밌는 RxSwift 입니다.


'Mobile > iOS' 카테고리의 다른 글

Swift. Codable Encoding (1)  (0) 2018.06.17
Swift. Codable Decoding (1)  (0) 2018.06.17
RxSwift distinct operator  (0) 2018.06.11
RxSwift의 take operators  (0) 2018.06.11
iOS Carthage 기본  (0) 2018.06.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
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
글 보관함