我目前正在尝试创建通用的createOrUpdate
函数。
理想情况下,我希望能够在NSManagedObject
的任何子类上调用:
Type.createOrUpdate(withID: id) { type in
// Code goes here assigning variable on the object
}
其中Type
是NSManagedObject
,而type
是Type
类型的实例。
这是我目前的实施,但我的问题是:
1)闭包中返回的type
不是Type
,
2)如果获取请求没有返回对象,我无法弄清楚如何创建T
类型的对象。
extension NSManagedObject {
class func createOrUpdate<T>(withID id: String, keypath: String = "uuid", _ block: @escaping (T) -> ()) {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: String(describing: self))
fetchRequest.predicate = NSPredicate(format: "\(keypath) == %@", id)
let context = CoreDataStackManager.shared.stack.backgroundContext
let updateAndSave: (T) -> () = { item in
block(item)
saveContext(context, wait: true, completion: nil)
}
do {
guard let item: T = try context.fetch(fetchRequest).first as? T else {
// This is where the new item should be created
// Would then call updateAndSave(newItem)
return
}
updateAndSave(item)
} catch {
print("Error fetching \(String(describing: self)) with \(keypath) \(id)")
}
}
}
编辑:
我现在有了这个用于创建新对象的地方,这意味着问题2已经解决:
guard let newObject: T = create(inContext: context) as? T else {
return
}
updateAndSave(newObject)