PeakCoreData是一个Swift微型框架,为Core Data
提供增强和便利。它是Peak Framework
的一部分。
观察者
ManagedObjectObserver
可以使用ManagedObjectObserver
类来观察单个受管理对象所做的更改。状态更改包括它被刷新、更新或删除的情况。
var event: Event!
var eventObserver: ManagedObjectObserver<Event>!
override func viewDidLoad() {
super.viewDidLoad()
eventObserver = ManagedObjectObserver(managedObject: event)
eventObserver.startObserving() { [weak self] obj, changeType in
guard let strongSelf = self else { return }
switch changeType {
case .initialised, .refreshed, .updated:
strongSelf.updateView()
case .deleted:
strongSelf.navigationController?.popToRootViewController(animated: true)
}
}
}
CountObserver
可以使用CountObserver
类来观察以泛型和可选的NSPredicate
定义的NSManagedObject
对象数量的更改。
var countObserver: CountObserver<Event>!
override func viewDidLoad() {
super.viewDidLoad()
let predicate = NSPredicate(format: "%K == false", argumentArray: [#KeyPath(Event.isHidden)])
countObserver = CountObserver<Event>(predicate: predicate, context: viewContext)
countObserver.startObserving() { [weak self] count in
guard let strongSelf = self else { return }
strongSelf.countLabel.text = String(count)
}
}
获取数据源
FetchCollection
FetchCollection
是对 NSFetchedResultsController
的包装,同时作为其自身的代理,并通过闭包公开更改。
let fetchedCollection = FetchedCollection(fetchRequest: Event.sortedFetchRequest(), context: viewContext)
fetchedCollection.onChange = { collection, update in
// use collection, or process updates
}
// subscriptable
let object = fetchedCollection[0, 0]
// or with a tuple
let object = fetchedCollection[(0, 0)]
// or with an index path
let object = fetchedCollection[IndexPath(row: 0, section: 0)]
这允许您将 NSFetchedResultsController
与您的 viewcontroller 解耦。
FetchCollectionViewDataSource
和 FetchTableViewDataSource
这些类负责使用 NSFetchedResultsController
与 UITableView
或 UICollectionView
所需的样板代码。
class EventsTableViewController: UITableViewController {
var dataSource: FetchedTableViewDataSource<EventsTableViewController>!
override func viewDidLoad() {
super.viewDidLoad()
let frc = NSFetchedResultsController(
fetchRequest: Event.sortedFetchRequest(),
managedObjectContext: viewContext,
sectionNameKeyPath: nil,
cacheName: nil
)
dataSource = FetchedTableViewDataSource(
tableView: tableView,
cellIdentifier: EventTableViewCell.cellIdentifier,
fetchedResultsController: frc,
delegate: self
)
dataSource.animateUpdates = true
dataSource.onDidChangeContent = {
print("Something changed")
}
dataSource.performFetch()
}
}
extension EventsTableViewController: FetchedTableViewDataSourceDelegate {
func identifier(forCellAt indexPath: IndexPath) -> String {
return EventTableViewCell.cellIdentifier
}
func configure(_ cell: EventTableViewCell, with object: Event) {
cell.textLabel?.text = object.date?.description
}
}
操作
CoreDataOperation
CoreDataOperation
是一个并发 Operation
子类,可用于在后台线程上执行核心数据任务。要使用它,只需继承 CoreDataOperation
,然后重写 performWork(in:)
方法。
关于此操作需要注意的事项
CoreDataOperation
只是将NSPersistentContainer
上的performBackgroundTask((NSManagedObjectContext) -> Void)
方法包装在一个操作中。- 要完成操作,您必须调用
saveAndFinish()
。 - 只有在您已将
viewContext
上的automaticallyMergesChangesFromParent
设置为true
时,更改才会合并到viewContext
中。 CoreDataOperation
遵循ProducesResult
协议,因此可以用于生成Result
。
CoreDataChangesetOperation
一个返回包含在操作过程中插入和更新的所有 NSManagedObjectID
对象的 Changeset
结构的 CoreDataOperation
子类。
CoreDataBatchImportOperation
和 CoreDataSingleImportOperation
两个 CoreDataChangesetOperation
子类,可以用来将中间对象数组或单个中间对象导入 Core Data。通常用于从您的网络服务导入 Decodable
对象。只要满足以下要求,这些操作就会自动运行
- 中间对象必须遵守
ManagedObjectUpdatable
和UniqueIdentifiable
。 - 您正在转换的
NSManagedObject
类型必须遵守ManagedObjectType
和UniqueIdentifiable
。
协议
ManagedObjectType
和 UniqueIdentifiable
为了使您的 NSManagedObject
子类能够访问插入、删除、检索和计数的各种辅助方法,只需使它们符合 ManagedObjectType
和 UniqueIdentifiable
协议即可。这样做也可以使您能够使用 CoreDataBatchImportOperation
和 CoreDataSingleImportOperation
。
PersistentContainerSettable
需要访问 NSPersistentContainer
的每个视图控制器都应该遵守 PersistentContainerSettable
。遵守此协议为您提供轻松访问 viewContext
属性和方法来保存 viewContext
。它还允许您更轻松地在 prepare(for:sender:)
中传递您的 NSPersistentContainer
。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let controller = segue.destination as? PersistentContainerSettable {
controller.persistentContainer = persistentContainer
}
if let navController = segue.destination as? UINavigationController, let controller = navController.topViewController as? PersistentContainerSettable {
controller.persistentContainer = persistentContainer
}
}
入门指南
安装
- 使用 Cocoapods,在 Podfile 中添加
pod 'PeakCoreData'
。 - 在必要的位置导入
import PeakCoreData
。
贡献
请参阅 CONTRIBUTING.md 了解我们的行为准则和提交拉取请求的流程。
版本管理
我们使用 SemVer 进行版本管理。
许可协议
本项目采用 MIT 许可协议,详情请参阅 LICENSE.md 文件。
致谢
Peak 框架
Peak框架是由3Squared团队创建的一系列开源微框架集合,以白垩峰地区命名。它包括以下几个部分:
名称 | 描述 |
---|---|
PeakOperation | 为Operation 提供增强和便利性,充分利用了Result 类型。 |
PeakNetwork | 这是一个基于Session 和PeakOperation构建的联网框架,利用了Codable 的强大功能。 |