반응형
데이터 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
}
}
반응형
'Programer > iOS' 카테고리의 다른 글
[Swift] ObjectMapper 에서 toJSON사용시 Nil 파라미터 추가 하기 (0) | 2019.12.10 |
---|---|
[Let's Swift] 렛츠 스위프트 판교 후기 (0) | 2019.12.07 |
[iOS] 개발에 사용하는 라이브러리 정리 & 추천 (5) | 2019.05.30 |
[Fastlane] iOS App 자동 배포 해보기 (0) | 2019.04.10 |
[UI] TableView에서 이미지 크기에 따라 Cell 크기 조정하기 (0) | 2019.01.18 |