swift - 无法从 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)
}
}
解决方案
最后我找到了解决方案。
添加的数据库位置:
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] }
...
现在它工作得很好。感谢您的评论帮助很大。
推荐阅读
- javascript - 如何访问 Promise 对象中的属性
- ios - 删除视图(和子视图)的自动布局约束,但保持相同的帧位置
- python - 如何在熊猫中添加缺失的日期
- c# - EF Core Migration 和 PostgreSQL - 使用自动增量列出错
- javascript - 按公共键(日期字符串)对对象数组进行分组
- arrays - 如何获取一些猫鼬模式数组中的值?
- mongodb - TypeError:update_one() 为参数“upsert”获取了多个值
- html - 表格可折叠/可扩展+可编辑
- tensorflow - 在 colab.research.google com 上重新运行后,相同 keras ML 模型的学习有所不同
- apache-spark - 以集群模式 SPARK 写入本地 FS