测试已测试 | ✗ |
Lang语言 | SwiftSwift |
许可协议 | MIT |
Released最后发布 | 2017年12月 |
SwiftSwift 版本 | 4.0 |
SPM支持 SPM | ✗ |
由 William Boles 维护。
CoreDataServices 是一系列辅助类和范畴,用于帮助移除围绕使用 Core Data 而附带的一些样板代码。
CoreDataServices 主要由一系列扩展 NSManagedObjectContext
的类别/扩展组成。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
ServiceManager.sharedInstance.setupModel(name: "Model")
return true
}
lazy var users: [User] = {
let ageSort = NSSortDescriptor(key: "age", ascending: true)
let users = ServiceManager.sharedInstance.mainManagedObjectContext.retrieveEntries(entityClass: User.self, sortDescriptors: [ageSort])
return users
}
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let totalUsers = ServiceManager.sharedInstance.mainManagedObjectContext.retrieveEntriesCount(entityClass: User.self)
return "Total Users: \(totalUsers)"
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let user = users[indexPath.row]
let predicate = NSPredicate(format: "userID==%@", user.userID!)
ServiceManager.sharedInstance.mainManagedObjectContext.deleteEntries(entityClass: User.self, predicate: predicate)
ServiceManager.sharedInstance.saveMainManagedObjectContext()
clearAndReloadUsers()
}
ServiceManager.sharedInstance.mainManagedObjectContext.saveAndForcePushChangesIfNeeded()
值得注意的是,当在后台/私有上下文中调用 saveAndForcePushChangesIfNeeded
时,更改将传播到父上下文,直到在主上下文中调用 save
。这引入了少量的性能开销,但确保了如果应用崩溃,则不会丢失保存的更改。
以下是两个方便的方法,使保存操作变得更容易。
//Main thread's context
ServiceManager.sharedInstance.saveMainManagedObjectContext()
//Background thread's context
ServiceManager.sharedInstance.saveBackgroundManagedObjectContext()
func addUserOnBackgroundContext() {
DispatchQueue.global(qos: .background).async { [weak self] in
ServiceManager.sharedInstance.backgroundManagedObjectContext.performAndWait({
let user = NSEntityDescription.insertNewObject(entityClass: User.self, managedObjectContext: ServiceManager.sharedInstance.backgroundManagedObjectContext)
user.userID = UUID().uuidString
user.name = "Anna BackgroundContext"
user.age = Int16(arc4random_uniform(102))
ServiceManager.sharedInstance.saveBackgroundManagedObjectContext()
DispatchQueue.main.async(execute: {
self?.clearAndReloadUsers()
})
})
}
}
CoreDataServices 具有以下 Core Data 栈实现:
.mainQueueConcurrencyType
并发类型,并直接附加到 PersistentStoreCoordinator
的 NSManagedObjectContext
- 目的是仅在主线程上使用此上下文。.privateQueueConcurrencyType
并发类型,它是父上下文为 .mainQueueConcurrencyType
的 NSManagedObjectContext
- 目的是仅在后台线程上使用此上下文。CoreDataServices 使用较新的主/私有并发解决方案而不是隔离并发,因为它提供了概念上最简单的解决方案。然而,为了在后台线程上按预期工作,您需要确保使用 perform
或 performAndWait
来访问后台线程上下文,以确保正在使用正确的线程。
有关Core Data堆栈不同配置的有趣文章可以在这里找到。
CoreDataServices附带一个示例项目,可以提供比以上列举的更多详细信息。
CoreDataServices使用模块来导入/使用框架 - 你需要在你的项目中启用此选项。
如果你遇到了与CoreDataServices相关的特定问题,或有功能请求,或者想分享评论,请在这里新建一个问题。请注意,一般Core Data的问题应该在Stack Overflow上提问。
我们鼓励并且非常欢迎拉取请求!请尽量保持与现有代码风格的一致性。如果你正在考虑对项目进行重大更改或添加,请提前通过打开一个新的问题进行沟通。这可以让每个人都参与到即将到来的更改中,确保更改与项目的设计理念相符,并避免重复工作。