CoreDataServices 4.0.0

CoreDataServices 4.0.0

测试已测试
Lang语言 SwiftSwift
许可协议 MIT
Released最后发布2017年12月
SwiftSwift 版本4.0
SPM支持 SPM

William Boles 维护。



  • 作者
  • 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()

使用后台 ManagedObjectContext

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 并发类型,并直接附加到 PersistentStoreCoordinatorNSManagedObjectContext - 目的是仅在主线程上使用此上下文。
  • 一个带有 .privateQueueConcurrencyType 并发类型,它是父上下文为 .mainQueueConcurrencyTypeNSManagedObjectContext - 目的是仅在后台线程上使用此上下文。

CoreDataServices 使用较新的主/私有并发解决方案而不是隔离并发,因为它提供了概念上最简单的解决方案。然而,为了在后台线程上按预期工作,您需要确保使用 performperformAndWait 来访问后台线程上下文,以确保正在使用正确的线程。

有关Core Data堆栈不同配置的有趣文章可以在这里找到。

CoreDataServices附带一个示例项目,可以提供比以上列举的更多详细信息。

CoreDataServices使用模块来导入/使用框架 - 你需要在你的项目中启用此选项。

发现问题了吗?

如果你遇到了与CoreDataServices相关的特定问题,或有功能请求,或者想分享评论,请在这里新建一个问题。请注意,一般Core Data的问题应该在Stack Overflow上提问。

我们鼓励并且非常欢迎拉取请求!请尽量保持与现有代码风格的一致性。如果你正在考虑对项目进行重大更改或添加,请提前通过打开一个新的问题进行沟通。这可以让每个人都参与到即将到来的更改中,确保更改与项目的设计理念相符,并避免重复工作。