[iOS] Diffable + Realm Delete Error

Madeline๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ปยท2024๋…„ 3์›” 20์ผ
0
post-thumbnail

๐Ÿšจ ์—๋Ÿฌ ๋‚ด์šฉ

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

  1. ๋ฐ”๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ ,
    ์‚ญ์ œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” isDelete: Bool์„ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•ด์„œ, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์‚ญ์ œ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•œ๋‹ค.
 @Persisted var isDeleted: Bool = false // ์‚ญ์ œ ์—ฌ๋ถ€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์†์„ฑ ์ถ”๊ฐ€
  1. Realm Delete๊ฐ€ ์•„๋‹Œ, Realm์˜ isDeleted๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค.
func markAsDeleted(diaryId: ObjectId) {
    if let diaryToDelete = realm.object(ofType: Diary.self, forPrimaryKey: diaryId) {
        try? realm.write {
            diaryToDelete.isDeleted = true
        }
    }
}
  1. ๋ฐ์ดํ„ฐ ์กฐํšŒ ์ˆ˜์ •
    ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ fetchํ•ด์˜ค๋Š” ๋ทฐ์—์„œ๋Š” isDeleted๊ฐ€ false์ธ ๊ฐ์ฒด๋งŒ ๊ฐ€์ ธ์˜ค๋„๋กํ•œ๋‹ค!
func fetchDiary() -> Results<Diary> {
    return realm.objects(Diary.self).filter("isDeleted == false")
}

์—ญ์‹œ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์€ ์–ด๋ ค์šด ๋งŒํผ ์พŒ๊ฐ์ด ์ฉ๋‹ค์ž‰

๊ทธ๋ฆฌ๊ณ  ์ผ์ฃผ์ผ ์ง€๋‚œ ํ›„

์ด์ œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ, ๋‚ด๊ฐ€ ์ฒ˜์Œ์— ํ•œ ๋ฐฉ๋ฒ•์€(๋ธ”๋กœ๊ทธ ๋‚ด์šฉ) ์ž„์‹œ๋ฐฉํŽธ๋ฐ–์— ๋˜์ง€ ์•Š์•˜๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์€ ํ•ด๋‹น Realm Repository๋ฅผ fetchํ•ด์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ๋‹ค์‹œ ๊ฒ€์ƒ‰ํ•ด๋ณด๊ณ , ์‹ค์งˆ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•จ์œผ๋กœ์จ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  snapshot์ด ์•„๋‹Œ, dataSource.applySnapshotUsingReloadData()๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋Œ€์‹  applySnapshotUsingReloadData๋Š” diffable์•ˆ์“ฐ๊ณ  reloaddata๋กœ ๋™์ž‘์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์—, ์ฒ˜๋ฆฌ๋˜๋Š” ๋กœ์ง์ด ๋‹ฌ๋ผ์ง€๊ธฐ์— ํ•ด๊ฒฐ์ด ๋˜์—ˆ๋‹ค.

profile
Major interest in iOS ๐Ÿ€ & ๐ŸŽ

0๊ฐœ์˜ ๋Œ“๊ธ€