개발/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 같은 것 을 사용하면 스레드가 알아서 백그라운드로 넘어가기 떄문에 발생할 확률이 높음

 

해결 방법

  1. struct 같은 값 타입 사용 하던지 Actor 같이 내부적으로 안전하게 처리되는 타입 사용
  2. 내부적으로 접근할때 동기적으로 접근
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
        }
       
  }