是否希望有一个类型安全的 CoreData Stack?
读取
let stack = Stack.defaultStack()
let query = Query<Person>().sort(byKey: "name", direction: .Ascending).filter("name == %@", name)
let results = try! stack.fetch(query)
print(results.first?.name)
写入
let stack = Stack.defaultStack()
stack.write({ (transaction) -> Void in
let person = try transaction.fetchOrInsert("name", identifier: name) as Person
person.age = 35
}, completion: nil)
CoreData 是一个强大的 API,但很容易被误用和误解。Stack 试图消除与在您应用程序中使用 CoreData 相关的许多问题。
具体来说,Stack 添加了用于处理查询和更新的类型安全和线程安全(ish)的方法。
此外,Stack 通过以下功能等提供了更加丰富的 API:
Stack 的目标是提供从 CoreData 到干净的、丰富的抽象。在保留上下文和线程管理等问题的同时,提供 CoreData 的灵活性和强大功能。
Swift 使得 Stack 现在支持类型安全的查询,在您应用程序中实现 CoreData 时,您将更有信心。
Stack 2.0 通过 Stack 本身提供只读访问,将所有写入方法移至事务中。这样可以防止您在事务之外尝试更新对象,从而避免许多常见错误。
Stack 被用于各种生产应用程序中,但我仍认为它是一个不断变化的概念,所以输入欢迎 :)
读取
一旦您有了 Stack,阅读就很容易。您只需要构造一个查询,然后在对您的 Stack 调用其中一个 fetch
方法。注意:由于查询可能会返回 nil,所以必需是可选的。
let person = try! stack.fetch("name", identifier: "123") as? Person
print(person?.name)
现在我们可以更新相同的对象。注意:感谢 Swift 闭包,我们可以安全地用相同的名称重新定义变量。
let stack = Stack.defaultStack()
stack.write({ (transaction) -> Void in
let person = transaction.copy(person)
person.age = 35
}, completion: nil)
如您所见,所有写入操作仅发生在交易内,这样可以防止实施 CoreData 时出现的许多常见错误。
你可能注意到了copy()函数?这是Stack提供的另一个优秀特性。基本上,它将对象复制到当前事务/上下文中,这样你就不需要在错误的线程上尝试修改对象。而且不用担心,所有更改会自动传播到其他线程,😉
要运行示例项目,首先从Examples目录克隆仓库,然后运行pod install
。
Stack可通过CocoaPods获取。要安装它,只需将以下行添加到Podfile中
pod “Stack”
Shaps, [email protected]
Stack可在MIT许可下使用。信息请参阅LICENSE文件。