Programer/iOS

[Swift] Realm 사용할 때 Crash 오류 관련

아즈샤 2019. 11. 25. 14:19
반응형

데이터 Object들을 Realm에 저장할 때 Crash 나는 경우가 종종 생깁니다.

그 중 가장 많이 비번하게 발생하는 곳이 Realm 밖에서 Write를 하는 경우 (= 불러온 Realm 객체를 다른 곳에서 수정하는 경우) 입니다.

 

예를 들어 체중 리스트 화면과 체중 수정 화면 두가지 화면이 있고, Weight라는 데이터를 Class로 사용하는 경우,

1. 리스트 화면에 체중 데이터를 뿌리기 위해 realm 에서 객체들을 load 합니다.

2. 체중을 수정하기 위해서 그 데이터를 가지고 수정 화면에서 들어갑니다.

3. 수정화면에서 데이터를 수정하면 Crash

 

최초 load한 Realm 밖에서 수정을 하였기 때문에 문제가 발생합니다.

 

하지만 아래와 같은 Extension를 사용하면 그러한 문제를 해결할 수 있습니다.

(detached()함수로 복사하여, realm과의 관계를 떼어놓을 수 있습니다.)

 

protocol DetachableObject: AnyObject {
    func detached() -> Self
}

extension Object: DetachableObject {
    func detached() -> Self {
        let detached = type(of: self).init()
        for property in objectSchema.properties {
            guard let value = value(forKey: property.name) else {
                continue
            }
            if let detachable = value as? DetachableObject {
                detached.setValue(detachable.detached(), forKey: property.name)
            } else { // Then it is a primitive
                detached.setValue(value, forKey: property.name)
            }
        }
        return detached
    }
}

extension List: DetachableObject {
    func detached() -> List<Element> {
        let result = List<Element>()
        forEach {
            if let detachableObject = $0 as? DetachableObject,
                let element = detachableObject.detached() as? Element {
                result.append(element)
            } else { // Then it is a primitive
                result.append($0)
            }
        }
        return result
    }
}
반응형