-
[Error] suspend resume partial function for XXX개발/Swift 2024. 8. 20. 14:39
“suspend resume partial function for 함수명”
라는 에러 발생
원인 파악
public func isFeatureEnabled(_ featureToggle: FeatureToggles) -> Bool { return featureToggles[featureToggle.value.key] }
let keyword is a constant and, therefore, read-only and thread-safe. When a variable is declared as var it becomes mutable and not thread-safe unless the data type is specifically designed to be thread-safe when mutable.
let 키워드를 사용한 상수 인경우 안전하나 var 같이 변경 가능한변수는 스레드 안전 하지 않음 이런거 쓸때는 잘 설계해서 써야함
특히 배열, 딕셔너리는 안전하지 않은 타입임
위 “featureToggles” 은 Dictionary 타입으로 Data Race 상황에 노출 될수 있다.
두개의 다른 스레드에서 featureToggles 을 읽기 쓰기가 동시에 일어난경우 크래시가 발생함
특히 싱글톤같은 패턴을 사용하면 하나의 자원을 여러곳에서 참조하여 사용할 것이고
Concurrency 같은 것 을 사용하면 스레드가 알아서 백그라운드로 넘어가기 떄문에 발생할 확률이 높음
해결 방법
- struct 같은 값 타입 사용 하던지 Actor 같이 내부적으로 안전하게 처리되는 타입 사용
- 내부적으로 접근할때 동기적으로 접근
private let serialQueue = DispatchQueue(label: "serial") public func isFeatureEnabled(_ featureToggle: FeatureToggles) -> Bool { var value: Bool? serialQueue.sync { value = featureToggles[featureToggle.value.key] } if let value = value { return value } else { return featureToggle.value.defaultValue } }
'개발 > Swift' 카테고리의 다른 글
Contact Framework 사용하여 연락처 불러오기 (0) 2024.09.03 Compositional Layout+ Diffable Datasource 활용 가이드 (0) 2024.08.27 [Error] navigationbar subview 레이아웃 에러 (0) 2024.08.20 [Swift] CoreData 사용해보기: CRUD 구현 가이드 (0) 2024.05.18 [Swift] Tab bar 와 Page view를 동시에 사용할때 (0) 2024.05.18