首页 > 解决方案 > 无法从 CoreData 加载 5 个随机数据以用于 Widget,有什么想法可以支持吗?

问题描述

下面是小部件时间线的代码和错误。获取请求返回总是空导致超出范围进入随机索引。数据和获取请求在所有其他应用程序视图中都可以正常工作,包括使用不同的谓词。


获取数据后出错

    func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        
        var entries: [WidgetContent] = []
        
        let managedObjectContext = persistenceController.container.viewContext
        
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Task");
        
        let currentDate = Date()
        
        for hourOffset in 0 ..< 5 {
            let entryDate = Calendar.current.date(byAdding: .minute, value: hourOffset, to: currentDate)!
            
            var entry = snapshotEntry
            
            var results = [Task]()
            
            do { results = try managedObjectContext.fetch(request) as! [Task] }
            catch let error as NSError { print("Could not fetch \(error), \(error.userInfo)") }
            
            let randomIndex = Int(arc4random_uniform(UInt32(results.count)))
            
            let displayComplete = results[randomIndex].isComplete
            let displayAdded = results[randomIndex].dateAdded
            let displayName = results[randomIndex].name
            let displayCategory = results[randomIndex].secondaryCategory
                
            entry = WidgetContent(date: entryDate, isComplete: displayComplete, dateAdded: displayAdded!, name: displayName!, secondaryCategory: displayCategory!)
            
            entries.append(entry)
        }
        
        let timeline = Timeline(entries: entries, policy: .atEnd)
        completion(timeline)
    }
}

标签: swiftcore-dataswiftuiwidget

解决方案


最后我找到了解决方案。

添加的数据库位置:

    let container: NSPersistentCloudKitContainer
    
init(inMemory: Bool = false) {
    let storeURL = AppGroup.tasks.containerURL.appendingPathComponent("Yours.sqlite")
    let description = NSPersistentStoreDescription(url: storeURL)

    container = NSPersistentCloudKitContainer(name: "Yours")
    if inMemory {
        container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
    }
    container.persistentStoreDescriptions = [description]
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
}

还更新了时间表以反映这些变化:

...

let managedObjectContext = PersistenceController.shared.container.viewContext
    

...

do { results = try managedObjectContext.fetch(request) as! [Task] }

...

现在它工作得很好。感谢您的评论帮助很大。


推荐阅读