개발/Swift
[Error] suspend resume partial function for XXX
덤벨로퍼
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
}
}