gpt4 book ai didi

ios - Swift - iOS10 - CoreData - Today Widget 中的 FetchRequest 总是返回 0 个元素

转载 作者:可可西里 更新时间:2023-11-01 02:08:49 33 4
gpt4 key购买 nike

我尝试在我的主应用程序中使用 CoreData,我想通过 Today Extension 访问它,稍后在我的 WatchApp 中访问它。

我为我的 Today Widget 添加了一个新目标 - 而不是为两个目标激活了 AppGroups。当然是同一个appGroup。

然后我构建了一个“SharedCode”框架。在我的 Main 和 Today 应用程序中共享帮助程序类和我的 CoreDataStack 类。

我构建了这篇博文中提到的 CoreDataStack:https://swifting.io/blog/2016/09/25/25-core-data-in-ios10-nspersistentcontainer/

我还添加了这段代码来更改目录:

final class PersistentContainer: NSPersistentContainer {
internal override class func defaultDirectoryURL() -> URL {
var url = super.defaultDirectoryURL()
if let newURL =
FileManager.default.containerURL(
forSecurityApplicationGroupIdentifier: CoreDataServiceConsts.applicationGroupIdentifier) {
url = newURL
}
return url
}
}

这是我的 CoreDataStack Helper 类:

struct CoreDataServiceConsts {
static let applicationGroupIdentifier = "nnnnnnnnn.group.is.xnd.xyz"
static let modelName = "Weight"
}

public class CoreDataStack {

public static let shared = CoreDataStack()
public var errorHandler: (Error) -> Void = {_ in }

//#1
public lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: CoreDataServiceConsts.modelName)
container.loadPersistentStores(completionHandler: { [weak self](storeDescription, error) in
if let error = error {
NSLog("CoreData error \(error), \(error._userInfo)")
self?.errorHandler(error)
}
})
return container
}()

//#2
public lazy var viewContext: NSManagedObjectContext = {
return self.persistentContainer.viewContext
}()

//#3
// Optional
public lazy var backgroundContext: NSManagedObjectContext = {
return self.persistentContainer.newBackgroundContext()
}()

//#4
public func performForegroundTask(_ block: @escaping (NSManagedObjectContext) -> Void) {
self.viewContext.perform {
block(self.viewContext)
}
}

//#5
public func performBackgroundTask(_ block: @escaping (NSManagedObjectContext) -> Void) {
self.persistentContainer.performBackgroundTask(block)
}

public func saveContext () {
guard viewContext.hasChanges else { return }

do {
try viewContext.save()
} catch let error as NSError {
print("Unresolved error \(error), \(error.userInfo)")
}
}
}

我为 NSPersistentContainer 构建了一个子类:

final class PersistentContainer: NSPersistentContainer {

internal override class func defaultDirectoryURL() -> URL {
var url = super.defaultDirectoryURL()

if let newURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: CoreDataServiceConsts.applicationGroupIdentifier) {
url = newURL
}

return url
}
}

在我的主应用程序中,我使用 NSFetchedResultController - 添加和获取实体工作得很好 :)

现在我想从 CoreData 读取 - 我使用 FetchRequest:

func fetchWeights() {

let fetchRequest: NSFetchRequest<Measure> = Measure.fetchRequest()
let dateSort = NSSortDescriptor(key: #keyPath(Measure.date), ascending: false)
fetchRequest.sortDescriptors = [dateSort]
fetchRequest.returnsObjectsAsFaults = false

do {
let results = try CoreDataStack.shared.viewContext.fetch(fetchRequest)
if results.count > 0 {
// There are found Weigts
print("weights FOUND: \(results.count)")
} else {
// Nil Weights found
print("NO weights: \(results.count)")
}
} catch let error as NSError {
print("Fetch error: \(error) description: \(error.userInfo)")
}
}

不,获取请求总是返回零个对象。但是我的 CoreData 中有实体 - 在我的主应用程序中有显示。

有什么想法吗?我不知道我做错了什么..谢谢你的帮助。

最佳答案

你已经定义了一个 PersistentContainer 子类来覆盖defaultDirectoryURL,但您的 CoreDataStack 仍在为您的惰性容器使用 NSPersistentContainer 类型中的构建。

这应该可以解决问题:

public class CoreDataStack {

public static let shared = CoreDataStack()
public var errorHandler: (Error) -> Void = {_ in }

//#1
public lazy var persistentContainer: PersistentContainer = {
let container = PersistentContainer(name: CoreDataServiceConsts.modelName)
container.loadPersistentStores(completionHandler: { [weak self](storeDescription, error) in
if let error = error {
NSLog("CoreData error \(error), \(error._userInfo)")
self?.errorHandler(error)
}
})
return container
}()

干杯迈克尔

关于ios - Swift - iOS10 - CoreData - Today Widget 中的 FetchRequest 总是返回 0 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41666064/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com