swift를 공부하면서 가장 어려운 부분이 ThreadSafe에 관한 부분이다.
class MessageRepository {
private var messagesStorage: [RequestMessageModel] = []
func addMessage(_ message: RequestMessageModel) {
messagesStorage.append(message)
}
func getMessages() -> [RequestMessageModel] {
return messagesStorage
}
func clearStorage() {
messagesStorage.removeAll()
}
}
위 코드처럼 배열에 접근을 해서 data를 삭제했다 넣었다 확인했다 지지고 볶을때는
동시성의 문제가 발생 될 수 있다.
해결방법
하나의 직렬큐로 엮어, 순차적으로 처리해, 레이스컨디션이 발생하지 않게 리팩토링을 진행했다.
class MessageRepository {
private var messagesStorage: [RequestMessageModel] = []
private let repoQueue = DispatchQueue(label: "repoQueue")
//직렬Queue를 만듬
//기존 메서드에서 구현하고자 하는 생각대로 동기 / 비동기 실행을 해준다
func addMessage(_ message: RequestMessageModel) {
repoQueue.async {
self.messagesStorage.append(message)
}
}
func getMessages() -> [RequestMessageModel] {
return repoQueue.sync {
messagesStorage
}
}
func clearStorage() {
repoQueue.sync {
self.messagesStorage.removeAll()
}
}
}
'🍎swift' 카테고리의 다른 글
UICollectionViewDelegateFlowLayout 활용 Cell크기 동적 할당 (1) | 2024.04.15 |
---|---|
swift indicator 구현 (0) | 2024.04.15 |
URLRequestBuilder만들기 .. feat 리팩토링 (0) | 2024.04.02 |
TLI - Concurrency (0) | 2024.01.17 |
[Swift] Stroyboard Navigation Controller를 활용한 화면이동 (1) | 2023.12.21 |