μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
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 |
- μ±λμμΈ
- Core Data
- SWiFT
- Decodable
- Filter
- DispatchQueue
- ios
- Cloud Firestore
- Figma
- νλ‘κ·Έλλ¨Έμ€
- CRUD
- AVAudioPlayer
- UIRefreshController
- μ§λ²λ³ν
- ExpressJS
- MongoDB
- nodejs
- μκ³ λ¦¬μ¦
- Firestore CRUD
- String.Index
- Reduce
- Codable
- components
- map
- Mac
- Encodable
- RxSwift
- mongoose
- μ±λ§λ€κΈ°
- Firestore
- Today
- Total
Focus On Develop π€π€
[Swift] Singleton Pattern (μ±κΈν€ ν¨ν΄) λ³Έλ¬Έ
[Swift] Singleton Pattern (μ±κΈν€ ν¨ν΄)
λ리λ¬μ΄ν 2021. 3. 16. 15:22μ€λλ§μ ν¬μ€ν μ νλ κ² κ°λ€μ, μ΄λ° μ λ° μ κ²½μΈ μΌλ€μ΄ λ§μλ κ² κ°μμ π
λ°λΉ λ ν루μ κ°λ¨ν ν¬μ€ν μ΄λΌλ νλλ νμκ³ λͺ©νλ₯Ό μΈμ λλ°, μ½μ§ μλκ΅°μ π
κ±°λμ λ―Ένκ³ μ€λμ μ±κΈν€ ν¨ν΄μ λν΄μ μμλ³Όκ²μ!!
Design Pattern
μ±κΈν€ ν¨ν΄μ Design Pattern μ€ μμ±κ³Ό κ΄λ ¨λ λμμΈ ν¨ν΄μ΄μμ. κ·ΈλΌ.. Design Patternμ λκΉμ?
κ°λ°μμ λμμΈν¨ν΄μ΄λ, λ€μν κ°λ°νκ²½μμλ λΉμ·ν λ¬Έμ λ€μ΄ λ°μν μ μλλ°, μ΄ λΉμ·ν λ¬Έμ λ€μ ν΄κ²°νλ μ νν(?)λ ν νλ¦Ώμ΄λ κ°λ°ν¨ν΄ κ°μ, λ§μΉ "ν΄κ²°μ± " κ°μκ±°μμ. μ΄λ° μ΄λ€ ν¨ν΄μ μ μ©νλ©΄, κ·Έλ§νΌ "μ νν"λ ν΄κ²°μ± κ°μ λ§₯λ½μ΄λ μ½λμ κ°λ μ±, ν¨μ¨μ±, λλ²κΉ , νμ λ±μ΄ μ¬μμ§κ² μ£ ?
Swiftμμ κ°μ₯ 보νΈμ μΌλ‘ μ ν μ μλ λμμΈ ν¨ν΄μ
- μμ± ν¨ν΄ : Singleton
- ꡬ쑰 ν¨ν΄ : MVC, MVVM, Facade
- νλ ν¨ν΄ : Delegate, Observer
λ±λ±μ΄ μμ΄μ. κ·Έμ€μ μ΄λ² ν¬μ€ν μμλ Singleton Patternμ λν΄ μ΄ν΄λ³΄λ €κ³ ν΄μ.
Singleton Pattern (μ±κΈν€ ν¨ν΄)
μ±κΈν€ ν¨ν΄μ΄λ, νΉμ μ©λλ‘ κ°μ²΄λ₯Ό νλλ§ μμ±ν΄μ 곡μ©μΌλ‘ μ¬μ©νκ³ μΆμλ μ¬μ©νλ μμ± λμμΈ ν¨ν΄μ΄μμ.
μ£Όλ‘ νκ²½μ€μ , λ‘κ·ΈμΈμ 보 λ±μ νΉμ μ©λλ‘ μμ±ν΄λκ³ , μ±μ μ¬λ¬ κ³³μμ μ κ·Ό κ°λ₯νλλ‘ λ§λ€μ΄μ λ°μ΄ν°λ₯Ό μ¬μ©νκ²λ λ§λ€ λ μ¬μ©λμ. 무μλ³΄λ€ μμλ₯Ό 보λκ² μ μΌ μ’κ² μ£ ~?
class Person {
static let shared = Person()
private var name: String = "KT"
private var nickName: String = "Nury"
private var age: Int = 50
}
μ΄λ κ² static propertyλ‘ sharedλΌλ κ°μ²΄λ₯Ό ν΄λμ€ λ΄μμ λ§λ€μ΄ μ£Όλ μμ± ν¨ν΄μ΄μμ.
μ΄λ κ² ν΄λλ©΄ μ±μ μ΄λμλ Person.shared κ°μ²΄λ‘ ν΄λμ€μ λ°μ΄ν°μ μ κ·Ό ν μ μκ² μ£ ?
μ.. μ’μ!
κ·Όλ° νΉμ μ©λλ‘ μ¬μ©ν κ°μ²΄λ₯Ό "νλ"λ§ μμ±ν΄μ μ°λκ±°λΌλ©°? λ€λ₯Έλ°μ let person = Person() νλ©΄ λλκ±° μλμΌ?
λ€, λ§μ΅λλ€! κ·Έλμ ν΄λμ€ μΈλΆμμ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν μ μλλ‘, μμ±μ(init)μ privateλ‘ λͺ μμ μΌλ‘ μ§μ ν΄μ€λλ€.
class Person {
static let shared = Person()
private var name: String = "KT"
private var nickName: String = "Nury"
private var age: Int = 50
private init() { }
}
μ΄λ κ²μ! κ·Έλ¬λ©΄ μ°λ¦¬κ° μνλλλ‘ νΉμ λͺ©μ (μ¬μ©μ μ 보)λ‘ μ±μμ μ¬μ©ν μ μΌν κ°μ²΄κ° λλ€μ~!
μ‘°μμ¨ λ~~~!!!
μ΄ μλλΌ! μ¬κΈ°μ κΌ μ£Όμν μ μ΄ μμ΄μ. λ°λ‘ thread-safeνκ² κ΅¬μ±μ ν΄μ€μΌ νλ€λ μ μΈλ°μ!
μ? thread-safeκ° λμΌ~~~??
Classλ Reference νμ μ΄κΈ° λλ¬Έμ, μ΄λμλ μ΄ μ±κΈν€ κ°μ²΄μ μ κ·Όμ νκ² λλ©΄ νλ©λͺ¨λ¦¬ μμμ μλ κ°μ²΄μ "μλ³Έλ°μ΄ν°"μ μ κ·Όνκ² λμ. μ¦ κ·Έλ§μ, μ±μ μ΄λ€κ³³μμλ λλ€μμ λ°κΎΈλ €κ³ μλνκ³ , μ±μ μ΄λ€ κ³³μμλ λλ€μμ κ°μ Έμμ 보μ¬μ£ΌκΈ°λ§ ν μλ μκ² μ£ . κ·ΈλΌ.. λμ€ νλμμλ μλͺ»λ λμμ ν κ±°μμ! π
μ¦, μ°λ¦¬λ μ±κΈν€ κ°μ²΄λ₯Ό μ¬μ©νκ³ μκ³ , μ΄ κ°μ²΄μ λν λ°μ΄ν°μ λν΄ μ¬λ¬ threadμμ λμμ μ κ·Όμ ν μλ μμκ±°μμ. μ΄λ κ² λλ©΄ λ°μ΄ν°κ° κΌ¬μ¬μ, μ λλ‘ λμνμ§ μκ² μ£ ? λ°λ‘ μ΄λ κ² μ¬λ¬ threadμμ λμμ 곡μ μμμ μ κ·Όν λ, μ°Έμ‘°νμ μ κ²½μ° λ°μ΄ν°κ° κΌ¬μΌ μ μλλ° μ΄λ° μνλ₯Ό "thread-unsafeνλ€" λΌκ³ ν΄μ.
κ·Έλ¦¬κ³ , μ±κΈν€ ν¨ν΄μμλ Readers-Writers λ¬Έμ λΌκ³ λ ν΄μ. (μ½λ μ¬λκ³Ό μ°λ μ¬λμ λ¬Έμ ! γ γ π)
κ·Έλ¬λκΉ μ°λ¦¬λ μ±κΈν€ ν¨ν΄μ μ¬μ©ν λ, λ°λμ thread-safeνλλ‘ μ€κ³λ₯Ό ν΄μ€μΌν΄μ.
μ΄κ²λ μλ₯Ό λ€μ΄ λ³Όκ²μ!
class Person {
...
func changeNickname() {
self.nickName = "changed Nury"
}
func getNickname() -> String {
return self.nickName
}
}
μ±μ μ΄λκ°μμ λλ€μμ μμ νκ±°λ, μ½μ΄μ€λ λΆλΆμ΄ λ€λ₯Έ μ€λ λμμ λμμ μνλλ€κ³ κ°μ ν΄λ³Όκ²μ.
κ·Έλ¬λ©΄ λλ λλ€μμ "changed Nury"λ‘ λ³κ²½νλλ°, νλ©΄μ 보μ΄λ λλ€μμ λ³κ²½λκΈ° μ μ κ·Έλ₯ "Nury" μΌ μ μλ€λ λ»μ΄μμ.
μ΄λ° νμμ΄ λ°μνλ κ·Όλ³Έμ μΈ μ΄μ λ, λ€λ₯Έ μ€λ λμμ "λμμ" μνλκΈ° λλ¬ΈμΌκ±°μμ.
μ.. μ€μΌμ΄. μ±κΈν€ κ°μ²΄λ 곡μ μμμ λμμ μ κ·Όν κ²½μ°μ thread-unsafety ν μ μꡬλ.
κ·ΈλΌ μ΄κ±Έ thread-safe νλλ‘ μ΄λ»κ² μ€κ³ν΄μ€μΌ ν κΉμ? λ°λ‘λ°λ‘... Concurrent Queueλ₯Ό νμ©νλ λ°©λ²μ΄μμ!
μ΄κ²λ μλ₯Ό λ€μ΄ λ³Όκ²μ!
class Person {
...
private let nicknameQueue = DispatchQueue(label: "nickname queue", attributes: .concurrent)
func changeNickname() {
nicknameQueue.async(flags: .barrier) {
self.nickName = "changed Nury"
}
}
func getNickname() -> String {
nicknameQueue.sync {
return self.nickName
}
}
}
nicknameQueueλΌλ Concurrent Queueλ₯Ό λ§λ€μ΄μ€¬μ΄μ.
μ’μ μ μ΄λ° μν©μ΄ λ°μνλ κ·Όλ³Έμ μΈ μ΄μ λ "λμμ" λ€λ₯Έ μ€λ λμμ 곡μ μμμ μ κ·ΌνκΈ° λλ¬Έμ΄λΌκ³ νμμ£ ?
μ΄κ±Έ λ°©μ§νκΈ° μν΄, μ 체μ μΌλ‘λ "λμμ" μ κ·Όνλ κ²μ νμ©νμ§λ§ μ΄λ κ² Readers-Writers μν©μ λ΄μ°©ν μ μλ μμ μ λ°λ‘ serial(μμ°¨μ μΌλ‘) μ§νλ μ μκ²λ λ¬Άμ΄μ£Όλ λ°©λ²μΌλ‘ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ κ±°μμ.
μ.. nicknameQueueλ₯Ό μ μν΄μ€λ concurrentλ‘ μ μΈν΄μ€¬μΌλ, λμμ μ κ·Όμ νμ©νλ€λκ±° μλ?
μμ°¨μ μΌλ‘λ μ΄λ»κ² μ§ννκ²λ ν 건λ°? μ΄λ λ°λ‘ queueμ flagμ barrierλ₯Ό μ¬μ©ν΄μ£Όλ κ±°μμ.
barrierλ λ§ κ·Έλλ‘ "λ°©μ΄λ§" κ·Έλ°κ±°μ£ ~? μ¦, barrierλ‘ κ°μΈμ§ μμ μ concurrent ν μμμλ Serial(μμ°¨μ μΌλ‘) μ§νλ μ μκ²λ λ§λ€μ΄μ£Όλ flagμμ.
κ²°λ‘ μ μΌλ‘ μ΄λ κ² μ€κ³λ₯Ό ν΄λμΌλ©΄,
"μ~ λλ€μ λ³κ²½μ λν μμ²μ΄ μ€λ©΄ κ·Έλ₯ λ³κ²½ν΄μ€! λ¨, λλ€μμ κ°μ Έμμ 보μ¬μ€λλ λ§μ½ λλ€μμ λ³κ²½νλ μμ μ΄ μ§νμ€μ΄λ©΄, κ·Έ μμ μ΄ μλ£λκ³ μνν΄μ€~!!!" κ° λλ κ±°μμ.
μ€μ λ‘ iOSμμ κΈ°λ³Έμ μΌλ‘ μ±κΈν€ ν¨ν΄μ λν κΈ°λ₯μ μ§μνκ³ μλλ°μ~!
let screen = UIScreen.main
let userDefault = UserDefaults.standard
let application = UIApplication.shared
let fileManager = FileManager.default
let notification = NotificationCenter.default
μ΄λμ λ§μ΄ λ³Έ κΈ°λ₯λ€μ΄κ³ μ¬μ©νκ³ κ³μμ£ ~? μ΄λ°κ² λͺ¨λ μ±κΈν€μ΄λλλ€~!!
κ°λ¨ν μμλ₯Ό ν΅ν΄μ λμμΈ ν¨ν΄μ€ νλμΈ μ±κΈν€ ν¨ν΄μ λν΄μ μμ보μμ΄μ!
μ΄λ»κ² μ¬μ©ν΄μΌ νλμ§ λλ μ’ μ€μλμ~~? π
μ€λλ λκ΅°κ°μκ² λμμ΄ λμκΈΈ λ°λμ π
'iOS [Swift] > κΈ°μ΄λ₯Ό ννν!' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[RxSwift] RxSwift μ λ¬ΈνκΈ° (4) | 2021.03.30 |
---|---|
[Swift] Class vs Struct (0) | 2021.03.16 |
[Swift] FileManager (0) | 2021.03.02 |
[Swift] Audio Recording (0) | 2021.03.01 |
[Swift] CaseIterable (0) | 2021.02.27 |