์๋ ํ์ธ์ Foma ์ ๋๋ค.
์ค๋์ iOS๋ฉด์ ์ง๋ฌธ์ ์์ฃผ ๋์ค๋ KVO์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
KVO๋?
๊ณต์ ๋ฌธ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋์ด์์ต๋๋ค.
ํด์ํด๋ณด๋ฉด KVO๋ Key Value Observing์ ์ค์๋ง์ด๊ณ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ฌํญ์ ์๋ ค์ฃผ๋ ์ฝ์ฝ์ ํ๋ก๊ทธ๋๋ฐ ํจํด์ด๋ผ๊ณ ํ๋ค์.
ํ๋กํผํฐ ์ต์ ๋ฒ willSet๊ณผ disSet์ด๋ ์ ์ฌํ์ง๋ง ์ธ๋ถ์ ๊ด์ฐฐ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๋ค๋ฆ ๋๋ค.
๊ฐ๋จํ๊ฒ ์ค๋ช ๋๋ฆฌ๋ฉด ๊ด์ฐฐํ๊ณ ์ถ์ ๊ฐ์ฒด์ ์ต์ ๋ฒ๋ฅผ ๋ฌ๊ณ ๊ทธ ๊ฐ์ด ๋ณํ ๋ ๋ฐ๋๊ธฐ์ ๊ฐ์ด๋ ๋ฐ๋๊ฐ์ ์๋ ค์ฃผ๋ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
KVO๋ Objective-C ๋ฐํ์์ ์์กดํฉ๋๋ค. ๊ณ ๋ก ์์ @objc dynamic๊ฐ ๋ถ์ NSObject Class๋ก ์์ฑํด์ฃผ์ด์ผํฉ๋๋ค.
๋จผ์ Swift 4 ์ด์ ์๋ ์ด๋ป๊ฒ ์ฌ์ฉํ์๋์ง๋ถํฐ ๋ณด๊ฒ ์ต๋๋ค.
์๋์ ๊ฐ์ด Person ํด๋์ค๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ
1
2
3
4
5
|
import Foundation
@objc class Person:NSObject {
@objc dynamic var name = "Fomagran"
}
|
Person์ ๊ด์ฐฐํ๋ Observer๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ค ๋ค func observeValue๋ ๋ฐ๋ก override ํจ์๋ก ๊ตฌํํด์ค์ผ ํ์ต๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class PersonObserver:NSObject {
var person:Person
init(withPerson:Person) {
self.person = withPerson
super.init()
self.person.addObserver(self, forKeyPath: #keyPath(Person.name), options: .new, context: &myContext)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if context == &myContext {
guard let change = change else { return }
print("\(person.name) has changed \(change[.newKey] ?? "")")
}
}
}
|
์๋์ฒ๋ผ Person ์ธ์คํด์ค์ PersonObsever ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ค ๋ค person์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let fomagran = Person()
let observer = PersonObserver(withPerson:fomagran)
fomagran.name = "Khalid"
fomagran.name = "Young"
}
}
|
์๋์ ๊ฐ์ด ์๋์ ์ด๋ฆ์ ๊ด์ฐฐํ๋ฉด์ ์๋์ ์ด๋ฆ๊ณผ ๋ฐ๋ ์ด๋ฆ์ ์ถ๋ ฅํ๊ฒ ๋ฉ๋๋ค.
ํ์ง๋ง Swift4๋ถํฐ๋ Person ํด๋์ค๋ง ๋ง๋ค์ด์ฃผ๊ณ PersonObserver๋ฅผ ๋ฐ๋ก ๊ตฌํํด์ฃผ์ง ์์๋ ๋ฉ๋๋ค.
๋์ ViewController์์ ์๋์ ๊ฐ์ด Observation์ ๋ง๋ค์ด์ฃผ๊ณ ์ธ์คํด์ค์ observe ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ๊ตฌํํด์ฃผ๋ฉด
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import UIKit
class ViewController: UIViewController {
var nameObservation: NSKeyValueObservation?
let fomagran = Person()
override func viewDidLoad() {
super.viewDidLoad()
nameObservation = fomagran.observe(\Person.name, options: [.old,.new,.initial]) { (person, name) in
print("\(name.oldValue ?? "") changed name to \(name.newValue ?? "")")
}
fomagran.name = "Young"
}
|
์๋์ ๊ฐ์ด ์ ์์ ์ผ๋ก ๊ด์ฐฐํ๊ณ ์๋์ ์ด๋ฆ๊ณผ ๋ฐ๋ ์ด๋ฆ์ ์ถ๋ ฅํ๊ฒ ๋ฉ๋๋ค.
๋ํ ๊ด์ฐฐํ๋ ๊ฒ์ ํด์ ์์ผ์ฃผ์ง ์์ผ๋ฉด ๊ณ์ ๊ด์ฐฐํ๊ฒ ๋๋ฏ๋ก viewWillAppear ๋ฉ์๋๋ฅผ ํ์ฉํด ํด์ ์์ผ์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
1
2
3
|
override func viewWillDisappear(_ animated: Bool) {
nameObservation?.invalidate()
}
|
์ด๋ ๊ฒ ์ค๋์ KVO์ ๋ํด์ ์์๋ณด์๋๋ฐ์.
์ ๋ง ๊ฐ๋จํ๊ฒ ์ด๋ค ๊ฒ์ธ์ง๋ง ์์๋ณด์์ ๋ถ์กฑํ์ง๋ง ๋ ๊น์ด ๊ณต๋ถํ๋ฉด ํ์ฉํ ๋ฐฉ๋ฒ์ด ์์ฃผ ๋ง์ ๊ฑฐ ๊ฐ์ต๋๋ค.
๋ง์ฝ ํ๋ฆฐ์ ์ด ์๊ฑฐ๋ ๋ถ์กฑํ ์ ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
๋๊ธ