无法从 CoreData 加载 5 个随机数据以用于 Widget,有啥想法可以支持吗?
Posted
技术标签:
【中文标题】无法从 CoreData 加载 5 个随机数据以用于 Widget,有啥想法可以支持吗?【英文标题】:Unable to load 5 random data from CoreData to use into Widget, any thoughts to support?无法从 CoreData 加载 5 个随机数据以用于 Widget,有什么想法可以支持吗? 【发布时间】:2020-12-27 05:19:01 【问题描述】:在小部件时间线和错误的代码下方。获取请求 返回总是空的,导致超出范围进入随机索引。 数据和获取请求可以在所有其他应用视图中正常工作,包括使用不同的谓词。
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)
【问题讨论】:
您设置了 AppGroup 吗? ***.com/questions/63922032/… 并确保您将核心数据保存到其中?另外你不应该使用 arc4random 你应该使用 Swift 的内置随机数生成 ***.com/a/24007169/5508175 是的,为应用程序和小部件创建和验证的 appgroup 还检查了权利。是的,正如我提到的应用程序工作正常,按预期将数据保存和加载到许多视图中,也使用不同的谓词。我只是在实现小部件。关于 random 和 arc4random,谢谢!对于反馈,我会看看它。 【参考方案1】:终于找到了解决办法。
添加的数据库位置:
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]
...
现在效果很好。感谢 cmets 帮了大忙。
【讨论】:
以上是关于无法从 CoreData 加载 5 个随机数据以用于 Widget,有啥想法可以支持吗?的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionview 未从 CoreData 完全加载图像获取随机空白单元格图像
在 cellForRowAtIndexPath 从 CoreData 加载图像会减慢滚动速度