You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:12:04