You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
func getCityWeather(){
cities.forEach{
useCase.getCityWeather(query: $0){[weak self] result inguardlet self =selfelse{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임
DispatchQueue.global().async에서 배열에 append를 해주었음
serial큐에서는 작업이 쌓여있어도, 큐에서 스레드로 보낸 작업이 끝나기 전까지는 큐에서 스레드로 다음 작업을 빼내지 않으므로 여러 스레드가 일을 처리하는 일이 없으므로, 특정 처리를 해주지 않아도 Thread safe함
하지만 내가 쓴 코드는 그게 아니기 때문에 에러가 발생함
사용한 코드에서의 문제는 global queue가 concurrent queue라는 것임.
동시에 task가 실행되는 queue. 따라서 동기화(synchronization)가 되지 않음.
이럴 때는 자신만의 custom serial queue를 만들어 사용하면 됨
디폴트로 Serial 특성을 가진 Queue임
이밖에도 NSLock() 혹은 Reader-Writer 패턴을 사용하면 됨
The text was updated successfully, but these errors were encountered: