-
[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' 카테고리의 다른 글
Compositional Layout+ Diffable Datasource 활용 가이드 (0) 2024.08.27 [Error] Diffable Datasource 사용중 겪은 여러 에러 해결 (0) 2024.08.26 [Error] 당신의 커스텀 UIControl 이 동작하지 않는 이유 (0) 2024.08.20 [Error] navigationbar subview 레이아웃 에러 (0) 2024.08.20 [Swift] CoreData 사용해보기: CRUD 구현 가이드 (0) 2024.05.18