Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Protocol
- combine
- 클린 코드
- ios
- HIG
- Refactoring
- RxCocoa
- swift documentation
- 리펙토링
- rxswift
- 스위프트
- clean architecture
- swiftUI
- collectionview
- UICollectionView
- 애니메이션
- map
- Xcode
- 리펙터링
- tableView
- Clean Code
- uitableview
- SWIFT
- ribs
- uiscrollview
- 리팩토링
- MVVM
- Observable
- Human interface guide
- UITextView
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] Atomic 프로퍼티 만드는 방법 (#NSLock) 본문
Atomic 이란?
- 다중 스레드 프로그래밍에서 사용되는 개념
- 연산이 더 이상 분할되거나 중단될 수 없음을 의미
- thread safe 지키는 방법 중 하나 (구체적인 개념은 이전 포스팅 글 참고)
ex) 두 명의 사용자가 프린터 출력 명령 -> 각 인쇄는 중단되지 않고 한번에 실행
- 만약 atomic이 아닌 경우, 두 사용자의 자료를 부분적으로 인쇄되는 문제
Atomic 프로퍼티 생성 방법
- NSLock을 사용 (자세한 개념은 이전 포스팅 글 참고)
- lock() 메소드를 사용하면 그 하위 코드들은 스레드가 하나만 접근할 수 있는 영역
주의) 가끔 아래처럼 NSLock을 상속받게끔 구현할 수 있지만, MyInt를 사용하는 쪽에서는 알아서 불필요한 NSLock의 프로퍼티들까지 인터페이스가 열리기 때문에 비추천
final class MyInt: NSLock {
private var value: Int
public init(_ value: Int) {
self.value = value
}
}
extension MyInt {
func add(_ other: MyInt, _ value: Int) -> Int {
other.lock()
let oldValue = other.value
other.value += value
other.unlock()
return oldValue
}
}
- 별도의 instance로 NSLock을 만들고 연산자의 시작 부분에 lock()을 사용하고 끝 부분에 unlock()을 호출되게하여 NSLock을 사용하는 것으로 wrapping한 형태
final class MyInt {
private var value: Int
private let lock = NSLock()
public init(_ value: Int) {
self.value = value
}
}
extension MyInt {
func add(_ valueToAdd: Int) -> Int {
lock.lock()
defer { lock.unlock() }
return value + valueToAdd
}
}
* 참고
- https://ko.wikipedia.org/wiki/%EC%9B%90%EC%9E%90%EC%A0%81_%ED%96%89%EC%9C%84
'iOS 응용 (swift)' 카테고리의 다른 글
Comments