🍎swift

Swift 배열, 동시성 문제

Kendrick 2024. 4. 4. 17:19

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()
        }
    }
}