SwiftyCoreData 0.4.1

SwiftyCoreData 0.4.1

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最新发布2019年7月
SPM支持 SPM

Cyril GarciaMichał Wójtowicz 维护。



  • 作者
  • Michał Wójtowicz

SwiftyCoreData

SwiftyCoreData 是一个用 Swift 编写的轻量级库。主要目的是在不必要模板代码的情况下使使用 CoreData 更容易。这个库使用 Swift 泛型和协议的强大功能。

优点

  • 线程安全
  • 不可变
  • 无共享状态
  • 无模板代码

安装(Alpha)

SwiftyCoreData 现在可在 CocoaPods 上用于 alpha 测试。只需在 podfile 中输入

pod 'SwiftyCoreData', :git => 'https://github.com/wojtowiczm/SwiftyCoreData.git', :branch => 'develop'

用法

在实现指南中所有步骤之后,我们的逻辑代码将如下所示

import SwiftyCoreData

class ViewModel {

    // Create SCDController with given ObjectType and ManagedObjectType and NSPersistentContainer
    let dbController = SCDController<Object, ManagedObject>(with: persistanceContainer)

    func loadCache() {
        dbController.fetchAll {
            // Do stuff with your fetched objects (Cats)
        }
    }
}

您可以在数据库使用各种操作,例如

  • 加载
  • 保存
  • 删除
  • 更新

注意:完整参考请访问:[SCDController](https://github.com/wojtowiczm/SwiftyCoreData/blob/master/SwiftyCoreData/SCDController.swift)

指南

技巧在于理解两个协议 SCDObjectConvertibleSCDManagedObjectConvertible。两者都是使用 SwiftyCoreData 的必要条件。

SCDObjectConvertible 中,我们实现从 CoreData 对象到应用程序中使用的 Swift 对象的映射。对于 SCDManagedObjectConvertible 也是同样,我们提供从 Swift 对象到 CoreData 对象的映射。

让我们看一个例子。我将使用“猫”例子,因为每个人都喜欢这些小东西;)

我们有 CatManagedObject 用于缓存目的,以及 Cat 在我们的程序中使用。

import CoreData
import SwiftyCoreData

@objc(CatManagedObject)
public class CatManagedObject: NSManagedObject {

    @NSManaged public var name: String?
    @NSManaged public var weight: Double
    @NSManaged public var age: Int16

    @nonobjc public class func fetchRequest() -> NSFetchRequest<CatEntity> {
        return NSFetchRequest<CatManagedObject>(entityName: "CatManagedObject")
    }
}

/* Conform to SCDObjectConvertible */
extension CatManagedObject: SCDObjectConvertible {

    // Associate type of Object we will be converting to
    public typealias Object = Cat

    // Implement mapping algortihm between our ManagedObject and Object
    public func toObject() -> Cat? {
        guard let name = name else { return nil }

        return Cat(name: name, weight: weight, age: Int(age), managedObjectID: objectID)
    }
}

接下来,我们的模型必须遵循: SCDManagedObjectConvertible

import CoreData
import SwiftyCoreData

// Note: Our model has to be public since SwiftyCoreData need information about it
public struct Cat {

    let name: String
    let weight: Double
    let age: Int

    // Note: It's good idea to store NSManagedObjectID for later purpose
    var managedObjectID: NSManagedObjectID?
}

/* Conform to SCDManagedObjectConvertible */
extension Cat: SCDManagedObjectConvertible {

    // Here implement algorith for putting our object in data base context
    // We need it for saving etc.
    public func put(in context: NSManagedObjectContext) {
        let catEntity = CatEntity(context: context)
        catEntity.name = self.name
        catEntity.weight = weight
        catEntity.age = Int16(age)
    }
}

性能

特定操作的平均时间

  • 读取(针对 100,000 个对象)
SwiftyCoreData average read time: 28.786418461563564 ms
CoreData average read time: 43.380704256567626 ms
  • 写入(针对 1,000 个对象)
SwiftyCoreData average write time: 19.355168437013532 ms
CoreData average write time: 24.809918781318288 ms

更多细节请访问 基准测试

多线程

SwiftyCoreData 是多线程友好的,只需定义使用 SCDOperatingQueue 的操作队列(可能的值:.main.background)即可。

SCDController (posible values: .main, .background

控制器构造函数如下

SCDController<Obejct, ManagedObject>(with: 持久化容器, operatingQueue: .main)

贡献

欢迎提交 Pull 请求和评论。

许可协议

MIT

参考文献

主要受到以下文章的启发:使用泛型改进CoreData