Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Swift] Thread Safe Array #115

Closed
seungchan2 opened this issue Jan 10, 2023 · 0 comments
Closed

[Swift] Thread Safe Array #115

seungchan2 opened this issue Jan 10, 2023 · 0 comments
Assignees
Labels

Comments

@seungchan2
Copy link
Owner

seungchan2 commented Jan 10, 2023

Thread 14: EXC_BAD_ACCESS (code=1, address=0xba0adae099c0)
 func getCityWeather() {
        cities.forEach {
            useCase.getCityWeather(query: $0) { [weak self] result in
                guard let self = self else { return }
                switch result {
                case .success(let data):
                    DispatchQueue.global().async {
                        self.weatherInfo.value += [data]
                    }
                case .failure(_):
                    print("실패")
                }
            }
        }

DispatchQueue.global().async에서 배열에 append를 해주었음
serial큐에서는 작업이 쌓여있어도, 큐에서 스레드로 보낸 작업이 끝나기 전까지는 큐에서 스레드로 다음 작업을 빼내지 않으므로 여러 스레드가 일을 처리하는 일이 없으므로, 특정 처리를 해주지 않아도 Thread safe함
하지만 내가 쓴 코드는 그게 아니기 때문에 에러가 발생함

사용한 코드에서의 문제는 global queue가 concurrent queue라는 것임.
동시에 task가 실행되는 queue. 따라서 동기화(synchronization)가 되지 않음.
이럴 때는 자신만의 custom serial queue를 만들어 사용하면 됨
디폴트로 Serial 특성을 가진 Queue임

    private let queue = DispatchQueue(label: "customQueue")
    
    self.queue.async { [weak self] in
        self?.weatherInfo.value += [data]
    }

이밖에도 NSLock() 혹은 Reader-Writer 패턴을 사용하면 됨

@seungchan2 seungchan2 self-assigned this Jan 10, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant