์๋ ํ์ธ์ Foma ์ ๋๋ค.
์ค๋์ RxSwift์์ ๊ฐ์ฅ ๊ธฐ์ด๊ฐ๋๋ Disposable๊ณผ DisposeBag์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~
Disposable
๋จผ์ dispose์ ์ฌ์ ์ ์๋ฏธ๋ ๋ญ๊น์?
์ฌ๋ฌ๊ฐ์ง ์๋ฏธ๊ฐ ์์ง๋ง Rx์์ ์ฌ์ฉ๋๋ ์๋ฏธ๋ "์ฒ๋ฆฌํ๋ค" ๋ผ๋ ๋ป์ด์์. ("์ทจ์ํ๋ค" ๋ผ๊ณ ๋ณด์ ๋ ๋ ๊ฑฐ๊ฐ์์)
๊ทธ๋ ๋ค๋ฉด disposable์ "์ฒ๋ฆฌํ ์์๋" ์ด๊ฒ ์ฃ ?
๋ง์ฝ ์ด๋ค ์์ ์ด ์คํ๋๋๋ฐ ์ด๊ฒ ๋๋ฌด ์ค๋๊ฑธ๋ฆฌ๊ฑฐ๋ ์๋๋ฉด ์ค๊ฐ์ ์ทจ์ํ๊ณ ์ถ๋ค๋ฉด ๋น๋๊ธฐ ์ฒ๋ฆฌ์ค์ธ ์์ ์
๋ฉ์ถฐ์ผํ๊ฒ ์ฃ ?
๋ง์ฝ Rx๋ฅผ ์ฌ์ฉํ์ง ์๊ณ GCD๋ก ๋น๋๊ธฐ์์ ์ ๊ตฌํํ๋ค๋ฉด ์ค๊ฐ์ ์ทจ์ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ณ
๋ง์ฝ ์ทจ์ํด์ผํ๋ค๋ฉด OperationQueue๋ฅผ ์ฌ์ฉํด์ cancelํด์ค์ผ ํ ๊ฑฐ์์.
Rx๋ cancel ๋์ disposable์ ์ฌ์ฉํด์ ์์ ์ ์ทจ์ํ ์ ์์ต๋๋ค.
์์ ์ ํจ๊ป ๋ณด์ค๊ฒ์.
์์ ๋ฅผ ์ค๋ช ๋๋ฆฌ๋ฉด 0๋ถํฐ 10000000 ์นด์ดํธํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ตฌํ๋ ๊ฒ์ ๋๋ค.
์๋์ ๊ฐ์ด 1๋ถํฐ 10000000๊น์ง ์นด์ดํธ๊ฐ ์๋ฃ๋๋ฉด ํ์ด๋จธ๊ฐ ๋ฉ์ถ๊ณ Completed๋ฅผ ๋์์ฃผ๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์ stop๋ฒํผ์ ๋๋ฅด๋ฉด ๋น๋๊ธฐ์์ ์ ๋ฉ์ถ๊ฒ ํ๋ ๊ฒ์ ๊ตฌํํ๊ณ ์ถ์ผ๋ฉด dispose๋ฅผ ์ด์ฉํ๋ฉด ๋ฉ๋๋ค.
์ฐ์ ์ disposable ๋ณ์๋ฅผ ๋ง๋ค์ด์ฃผ์๊ณ
์์ isCompletedCount ํจ์์ ๋ณ์๋ฅผ disposable๋ก ์ ํด์ฃผ์๊ณ
stop์ก์ ์ ์ ํด์ค disposable์ disposeํด์ฃผ์๋ฉด ๋ฉ์ถ๋ ๊ธฐ๋ฅ ๊ตฌํํ ์ ์์ต๋๋ค.
์๋์ ๊ฐ์ด stop๋ฒํผ์ ๋๋ฅด๋ฉด ๋น๋๊ธฐ ์์ ์ด ๋ฉ์ถ๊ฒ ๋๊ณ ์ทจ์๋์์ต๋๋ค๋ก ๋ ์ด๋ธ์ ๋์ธ ์ ์์ต๋๋ค.
DisposeBag
๋ง์ฝ 0๋ถํฐ 10000๊น์ง ์ธ๋ ์์ ๊ณผ 0๋ถํฐ 20000๊น์ง ์ธ๋ ์์ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ๋น๋๊ธฐ ์์ ์ด ์๊ณ
์ด ์ฌ๋ฌ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ํ๋ฒ์ ์ทจ์ํ๋ ค๊ณ ํ ๋๋ ์ด๋ป๊ฒ ํด์ผํ ๊น์?
๋ฐ๋ก ์ด๋ ์ฒ๋ฆฌ๋ฅผ ๋ด๋ ๊ฐ๋ฐฉ์ ๋ง๋ค์ด๋๊ณ ์ด ๊ฐ๋ฐฉ์ ํ๋ฒ์ ์ง์๋ฒ๋ฆฌ๋ฉด ๋ฉ๋๋ค.
์ด๋ ์ฒ๋ฆฌ๊ฐ ๋ฐ๋ก disposable ์ด๊ณ ๋ด๋ ๊ฐ๋ฐฉ์ด DisposeBag ์ด์ฃ .
์ฌ์ฉ๋ฐฉ๋ฒ์ disposeBag์ ๋ง๋ค์ด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณค ์ต์ ๋ฒ๋ธ์ ๋ฐํํ๋ ํจ์๋์ dispose๋ฅผ ๋ฌ์์ฃผ๊ณ disposeBag์ ๋ด์์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋ด๊ธด disposeBag์ ๋น์์ฃผ๋ฉด dispose๊ฐ ๋ฌ๋ฆฐ ํจ์๋ค์ ๋ชจ๋ ์ทจ์๊ฐ ๋ฉ๋๋ค.
๋ฐ๋ก ์๋์ฒ๋ผ ํ๋ฒ์ ๋ ๋น๋๊ธฐ ์์ ์ด ์ทจ์๊ฐ ๋ฉ๋๋ค.
Source Code
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
import UIKit
import RxSwift
class ViewController: UIViewController {
@IBOutlet weak var completed: UILabel!
@IBOutlet weak var number: UILabel!
var count = 0.0
var timer:Timer?
var disposable:Disposable?
override func viewDidLoad() {
super.viewDidLoad()
startTimer()
isCompletedCount()
}
func startTimer() {
timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(update), userInfo: nil, repeats: true)
}
@objc func update() {
count += 0.1
number.text = String(format: "%.1f", count) + String("์ด๊ฐ ๊ฑธ๋ ธ์ด์")
}
@IBAction func stop(_ sender: Any) {
disposable?.dispose()
timer?.invalidate()
completed.text = "์ทจ์๋์์ต๋๋ค."
}
func isCompletedCount() {
disposable = rxCountNumber()
.observeOn(MainScheduler.instance)
.subscribe({[weak self] _ in
self?.completed.text = "Completed!"
})
}
func countNumber(completed: @escaping (Bool?) -> Void) {
DispatchQueue.global().async {
for _ in 0...10000000 {
}
self.timer?.invalidate()
completed(true)
}
}
func rxCountNumber() -> Observable<Bool> {
return Observable.create { [weak self] o in
self?.countNumber { (result) in
o.onNext(result ?? false)
o.onCompleted()
}
return Disposables.create()
}
}
}
|
cs |
Reference
์๋๋ฅผ ์ฐธ๊ณ ํ์์ต๋๋ค.
'๐ Language > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxSwift] Operator๋? (0) | 2021.01.19 |
---|---|
[RxSwift] Observable ๊ฐ๋จํ๊ฒ ์์๋ณด๊ธฐ (0) | 2020.12.29 |
[Swift] @discardableResult๋? (0) | 2020.12.24 |
[Swift] toggle์ ์ด์ฉํ์ฌ Bool๊ฐ ์ฝ๊ฒ ๋ฐ๊พธ๊ธฐ (0) | 2020.11.13 |
[RxSwift] RxSwift๋ฅผ ํด์ผํ๋ ์ด์ (0) | 2020.09.03 |
๋๊ธ