[iOS | SwiftUI] RLMException: Object has been deleted or invalidated 에러 해결

someng·2022년 10월 18일
0

iOS

목록 보기
12/33

SwiftUI의 Realm 데이터 삭제를 하는 과정에서 자꾸 해당 에러가 발생하였다.. 🤯

Terminating app due to uncaught exception 'RLMException', reason: 'Object has been deleted or invalidated.'

디버깅과 구글링으로 에러 해결방법을 찾아서 여러 방법을 시도하였고,
약 4시간의 시도 끝에 해결했다..!!! 😝✌🏻

해결의 힌트는 여기서 얻었다 ㅎㅎ (감사룽 ~~)

👩🏻‍💻 코드 설명

먼저, Realm Data를 삭제하는 코드이다.
Place class의 primary key에 해당하는 id를 기준으로 쿼리문을 실행하고,
일치하는 데이터를 Realm DB에서 삭제하는 매커니즘이다.

func deletePlaceData() {
        
	let predicate = NSPredicate(format: "id == %@", place.id as CVarArg)
	if let filteredData = realm.objects(Place.self).filter(predicate).first {
		try! realm.write{
			realm.delete(filteredData)
		}
	}
}

위 함수를 정의하는 class 코드는 대략 다음과 같다.

final class PlaceDetailViewModel: ObservableObject {
    @Published var places: Binding<[Place]>
    @Published var place: Place
    
    init(places: Binding<[Place]>, place: Place) {
        self.places = places
        self.place = place
    }
}

📌 Realm에서 Data를 삭제하는 것에는 문제가 없지만,
삭제한 후에 삭제된 place instance에 접근하는 것이 문제이다.

deletePlaceData() 함수에 place instance를 초기화하는 코드를 추가하였다.

place = Place()

이제 에러 없이 Realm Data 삭제가 성공적으로 이루어진다! 🥳

🔗 프로젝트 전체 코드

https://github.com/someng2/Dr.Gourmet.swiftUI

profile
👩🏻‍💻 iOS Developer

0개의 댓글