PeakCoreData 5.0.0

PeakCoreData 5.0.0

David YatesSam Oakley维护。



  • David Yates,Sam Oakley和Ben Walker

PeakCoreData

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 解耦。

FetchCollectionViewDataSourceFetchTableViewDataSource

这些类负责使用 NSFetchedResultsControllerUITableViewUICollectionView 所需的样板代码。

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 子类。

CoreDataBatchImportOperationCoreDataSingleImportOperation

两个 CoreDataChangesetOperation 子类,可以用来将中间对象数组或单个中间对象导入 Core Data。通常用于从您的网络服务导入 Decodable 对象。只要满足以下要求,这些操作就会自动运行

  • 中间对象必须遵守 ManagedObjectUpdatableUniqueIdentifiable
  • 您正在转换的 NSManagedObject 类型必须遵守 ManagedObjectTypeUniqueIdentifiable

协议

ManagedObjectTypeUniqueIdentifiable

为了使您的 NSManagedObject 子类能够访问插入、删除、检索和计数的各种辅助方法,只需使它们符合 ManagedObjectTypeUniqueIdentifiable 协议即可。这样做也可以使您能够使用 CoreDataBatchImportOperationCoreDataSingleImportOperation

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的强大功能。