iOS 18下SwiftData删除播放列表触发致命错误求助
iOS 18 SwiftData 内存存储删除数据触发致命错误的解决方案
问题详情
适配iOS 18时,使用SwiftData内存存储数据,删除播放列表时触发致命错误:
Thread 10: Fatal error: Never access a full future backing data - PersistentIdentifier(id: SwiftData.PersistentIdentifier.ID(url: x-coredata://4885953A-BDB2-4CD1-9299-B2FBBB899EB7/PlaylistItem/p372), implementation: SwiftData.PersistentIdentifierImplementation) with Optional(B2A80504-2FE1-4C86-8341-3DDE8B6AB913)
触发错误的代码:
func deletePlaylist(_ playlist: PlayListModel) async throws { print("attempt to delate :, \(playlist.playlistName)") context.delete(playlist) try context.save() // error here on the save }
该问题仅在iOS 18中出现,iOS 17下无异常。
可行解决方案
确保上下文线程安全:SwiftData的
ModelContext不支持跨线程操作,将删除逻辑放到上下文的执行队列中:func deletePlaylist(_ playlist: PlayListModel) async throws { try await context.perform { print("attempt to delete :, \(playlist.playlistName)") self.context.delete(playlist) try self.context.save() } }验证对象的上下文关联性:iOS 18对对象所属上下文的检查更严格,先确认对象是否在当前上下文内,若不在则重新获取:
func deletePlaylist(_ playlist: PlayListModel) async throws { guard context.registeredObjects.contains(playlist) else { let fetchDescriptor = FetchDescriptor<PlayListModel>(predicate: #Predicate { $0.id == playlist.id }) guard let validPlaylist = try context.fetch(fetchDescriptor).first else { return } context.delete(validPlaylist) try context.save() return } context.delete(playlist) try context.save() }检查内存存储配置:确认初始化
ModelContainer时明确设置内存存储,避免iOS 18下的默认配置变化:let container = try ModelContainer( for: PlayListModel.self, configurations: ModelConfiguration(isStoredInMemoryOnly: true) )调整保存时机:尝试延迟保存操作,给SwiftData足够的时间处理对象状态:
func deletePlaylist(_ playlist: PlayListModel) async throws { context.delete(playlist) try await Task.sleep(nanoseconds: 100_000_000) try context.save() }
内容的提问来源于stack exchange,提问作者Damiano Miazzi
相关产品推荐
相关产品推荐

