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)
指南
技巧在于理解两个协议 SCDObjectConvertible
和 SCDManagedObjectConvertible
。两者都是使用 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 请求和评论。
许可协议
参考文献
主要受到以下文章的启发:使用泛型改进CoreData