๐จ ์๋ฌ ๋ด์ฉ
Terminating app due to uncaught exception 'RLMException', reason: 'Object has been deleted or invalidated.
์ดํ ๋ด๋ด ์ด๊ฑฐ ํด๊ฒฐ ๋ชปํ๊ณ ์์๋ค.
์ฐ์ DiffableDataSource์ Realm์ ํจ๊ป ์ฌ์ฉํ๊ณ ,
Diffable์ ๋ฐ์ดํฐ๊ฐ ๋ณํ๋ฉด, ์ด์ ์ํ์ ๋น๊ตํด์ ๋ทฐ๋ฅผ ๊ฐฑ์ ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
๋ฐ๋ผ์ Realm ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ๋ทฐ๋ ์
์์ ์ํ๊ฐ ๋ณํ๋ค๋ฉด,
realm์์ ์ํ ๋ณํ๊ฐ ์ผ์ด๋๊ณ ,
Diffable View์์๋ snapshot์ผ๋ก ๋ฌ๋ผ์ง ์ ์ ๋ฐ์ํ๊ณ , ํ๋ฉด์ ๊ฐฑ์ ํ๊ฒ ๋ค.
๊ทผ๋ฐ ๋ฌธ์ ๋ Delete์์ ๋ฐ์ํ๋ค.
Realm์์ ์์ฑํ ๊ฐ์ฒด๋ ์ญ์ ํ ์ดํ์๋ ์ฐธ์กฐํ ์ ์๋๋ฐ,
Diffable DataSource ์
์ฅ์์๋ ์๋ ๊ฐ์ฒด์ ๋น๊ต๋ฅผ ํด์ผ ํ๋,
์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋๊ฑฐ๋ค.
์ง์ง ์ ๋๋์ง ์๊ณ ์๊ณ , ์์ ์๊ฐ์๋ ๋ฐฐ์ ๋ ๊ฒ๋ ์๋ค. ๐คฆ๐ปโโ๏ธ
์ง์ด๋ค์์ ์ฐ์ง ๋ง์๋ผ
๊ทผ๋ฐ CRUD ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ๋๋ฐ ์ด๋กํ๋.
๋ทฐ ๊ตฌ์กฐ๋ฅผ ๋ค์ ๋ฆฌํฉํ ๋งํด์ผํ๋..? ์ง์ง ์๊ฐ๋ ํ๊ธฐ ์ซ์์
์ฒ์์ ์์ ๋ง ์๋ชป๋์๋ค๊ณ ์๊ฐํด์, ๋๋ค๋ฅธ trigger(๋ทฐ๋ชจ๋ธ+Observable๋ก ์ํ ๊ด์ฐฐ, NotificationCenter)๋ฅผ ๋์ด์ delete๋๊ฑธ DiffableDataSource๊ฐ snapshot์ผ๋ก ๋ฌ๋ผ์ง ์ ์ ์ฐพ๊ธฐ ์ ์, ์ญ์ ๋์์ผ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ fetchํด๋ณด๊ธฐ๋ ํ๋๋ฐ, ๋๊ฐ์ ์๋ฌ๊ฐ ๋ฐ๋ณต๋์๋ค.
๊ทธ๋ฆฌ๊ณ Diffable์ ์ฐ๋ ์๋ฏธ๋ ์์ด์ง๋ค.
๊ทธ๋์ ๋ค์ ๋ธ๋ก๊ทธ์ ์ฑ์ ์๋์ด๋ ์ง๊ธ ์ด์๊ฐ๊น์ง ์ธ์ฐ๋ค๊ฐ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ:
https://doing-programming.tistory.com/entry/DiffableDataSource%EC%99%80-Realm
@Persisted var isDeleted: Bool = false // ์ญ์ ์ฌ๋ถ๋ฅผ ํ์ํ๋ ์์ฑ ์ถ๊ฐ
func markAsDeleted(diaryId: ObjectId) {
if let diaryToDelete = realm.object(ofType: Diary.self, forPrimaryKey: diaryId) {
try? realm.write {
diaryToDelete.isDeleted = true
}
}
}
func fetchDiary() -> Results<Diary> {
return realm.objects(Diary.self).filter("isDeleted == false")
}
์ญ์ ํธ๋ฌ๋ธ์ํ ์ ์ด๋ ค์ด ๋งํผ ์พ๊ฐ์ด ์ฉ๋ค์
์ด์ ์๊ฐํด๋ณด๋, ๋ด๊ฐ ์ฒ์์ ํ ๋ฐฉ๋ฒ์(๋ธ๋ก๊ทธ ๋ด์ฉ) ์์๋ฐฉํธ๋ฐ์ ๋์ง ์์๋ค. ๊ถ๊ทน์ ์ผ๋ก ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ํด๋น Realm Repository๋ฅผ fetchํด์ค๋ ์ฝ๋๋ฅผ ํ๋ก์ ํธ ์ ์ฒด์์ ๋ค์ ๊ฒ์ํด๋ณด๊ณ , ์ค์ง์ ์ผ๋ก ์ฌ์ฉ๋์ง ์๋ ์ฝ๋๋ฅผ ์ญ์ ํจ์ผ๋ก์จ ์๋ฌ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค. ๊ทธ๋ฆฌ๊ณ snapshot์ด ์๋, dataSource.applySnapshotUsingReloadData()๋ฅผ ์ฌ์ฉํ๋ค. ๋์ applySnapshotUsingReloadData๋ diffable์์ฐ๊ณ reloaddata๋ก ๋์์ํค๊ธฐ ๋๋ฌธ์, ์ฒ๋ฆฌ๋๋ ๋ก์ง์ด ๋ฌ๋ผ์ง๊ธฐ์ ํด๊ฒฐ์ด ๋์๋ค.