创建通用Swift createOrUpdate方法

时间:2017-05-19 14:42:03

标签: ios swift generics core-data

我目前正在尝试创建通用的createOrUpdate函数。

理想情况下,我希望能够在NSManagedObject的任何子类上调用:

Type.createOrUpdate(withID: id) { type in
// Code goes here assigning variable on the object
}

其中TypeNSManagedObject,而typeType类型的实例。

这是我目前的实施,但我的问题是:

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)

0 个答案:

没有答案