SuperRecord 1.6

SuperRecord 1.6

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2015年12月
SPM支持SPM

Piergiuseppe LongoMichael Armstrong维护。



  • 作者:
  • Michael Armstrong

SuperRecord

**从版本 >= 1.4 支持 SWIFT 2.0 ** ** 从版本 <= 1.3 支持 SWIFT 1.2 **

一个由多个 扩展助手 组成的 Swift CoreData 框架,旨在为常见的 CoreData 任务带来便利并减少麻烦。


每个功能都可以独立使用,因此不需要对整个项目进行“买入”。例如,您可以使用自己的 NSFetchedResultsControllerNSManagedObjectContext,以及任何搜索器,甚至 SuperFetchedResultsControllerDelegate

我想向 MagicalRecord 致以崇高的敬意,我认为它为这类项目奠定了坚实的基础。尽管它有过起伏,但它似乎正处于重开发之中。显然,这个 Swift SuperRecord 项目的灵感来自于 MagicalRecord 所做的工作。

特性

SuperRecord 由几个扩展组成,用于向您的 NSManagedObject 子类添加 MagicalRecord/ActiveRecord 风格的“查找器”,一个 FetchResultsControllerDelegate 类,用于处理对 UITableViewUICollectionView 的安全批量更新,以及一个实验性的模板 CoreData Stack 单例。

该项目是在 Swift 的几个版本上构建的,因此某些选择可能最初看起来有些奇怪。

将 SuperRecord 添加到您的项目

方法 3(子模块)

git submodule add https://github.com/michaelarmstrong/SuperRecord.git SuperRecord
  • 将检出子模块拖动到 Xcode 中
  • 单击主应用程序目标
  • 打开“构建阶段”
  • 将 SuperRecord.framework 添加到“目标依赖项”下

方法 4(手动)

git clone https://github.com/michaelarmstrong/SuperRecord.git

现在直接将源文件添加到您的项目。

核心文件

  • NSManagedObjectExtension.swift 这个扩展负责大部分的“查找器”功能,具有 deleteAll()findOrCreateWithAttribute()createEntity() 等操作,并允许您指定自己的 NSManagedObjectContext 或使用默认的(在主线程上运行)。

  • NSFetchedResultsControllerExtension.swift 正在不断开发中,此扩展可以轻松创建用于与 UICollectionViewUITableView 一起使用的 FetchedResultsControllers,这些控制器使用 SuperFetchedResultsControllerDelegate 来进行安全的批量更新。

  • SuperFetchedResultsControllerDelegate.swift 受我在过去项目中的工作以及其他流行的开源项目的启发。此程序处理跨 iOS 7 和 iOS 8 的 UICollectionViewUITableView安全批量更新。它可以独立使用您的 NSFetchedResultsController,或者作为 SuperRecord 中包含的方法的一部分自动使用,这些方法是 breathed by。

  • SuperCoreDataStack.swift 是一个实验性的样板文件主线程 CoreData 栈。既可以作为 sqlite 存储,也可以作为内存存储使用。只需调用 SuperCoreDataStack.defaultStack() 使用 SQLite 或 SuperCoreDataStack.inMemoryStack() 以用于内存存储。当然,您有权访问您的上下文 .context / .saveContext()

使用方法

创建新实体

假设您有一个类型为“Pokemon”的 NSManagedObject,您可以执行以下操作

let pokemon = Pokemon.createNewEntity() as Pokemon

请暂时将 @objc(className) 添加到所有 NSManagedObject 子类的名称之上(如演示项目所示)。未来将有更好的支持。

创建 NSFetchedResultsController

为了您的方便,SuperRecord 为 NSFetchedResultsController 增加了许多方便的工厂方法,以简化您的生活,但仍然是强大的。始终如一,您不必使用这些方法与 SuperRecord 一起使用,但这些方法都是为了您的方便而存在的。SuperRecord 的许多工厂方法将为您传递的 collectionView 或 tableView 处理安全的批量更新。不再有复杂的处理。

lazy var fetchedResultsController: NSFetchedResultsController = self.superFetchedResultsController()

func superFetchedResultsController() -> NSFetchedResultsController {
return NSFetchedResultsController.superFetchedResultsController("Pokemon", tableView: tableView)
}

或针对更多高级用法(某κολυμπούσης με πολλαπλές ενότητες και ένα predial με αυτόματα batch updates)

let sortDescriptors = [NSSortDescriptor(key: "evolutionLevel", ascending: false),NSSortDescriptor(key: "level", ascending: false)]
let predicate = NSPredicate(format: "trainer = %@", self.trainer)!
let tempFetchedResultsController = NSFetchedResultsController.superFetchedResultsController("Pokemon", sectionNameKeyPath: "evolutionLevel", sortDescriptors: sortDescriptors, predicate: predicate, collectionView: self.collectionView, context: context) 

使用 Pokemon 作为您的 NSManagedObject 的实体名称。

删除实体

我计划很快添加更多具有强大功能的删除功能,例如 deleteAllWithPredicate() 或 deleteEntity(),现在可用的仅为

Pokemon.deleteAll()

方法列表

这不是所有方法和类的详尽列表,但它包括一些最有用的方法。

NSManagedObjectExpansion

  • findAllWithPredicate(predicate: NSPredicate!, context: NSManagedObjectContext) -> NSArray
  • findAllWithPredicate(predicate: NSPredicate!) -> NSArray
  • deleteAll(context: NSManagedObjectContext) -> Void
  • deleteAll() -> Void
  • findAll(context: NSManagedObjectContext) -> NSArray
  • findAll() -> NSArray
  • findFirstOrCreateWithPredicate(predicate: NSPredicate!) -> NSManagedObject
  • findFirstOrCreateWithPredicate(predicate: NSPredicate!, context: NSManagedObjectContext) -> NSManagedObject
  • createNewEntity() -> NSManagedObject
  • findFirstOrCreateWithAttribute(attribute: NSString!, value: NSString!, context: NSManagedObjectContext) -> NSManagedObject
  • findFirstOrCreateWithAttribute(attribute: NSString!, value: NSString!) -> NSManagedObject

NSFetchedResultsControllerExtension

使用以下方法创建的 NSFetchedResultsController 将会自动处理传递给 UITableViewUICollectionView 的安全批量更新。

  • superFetchedResultsController(entityName: NSString!, collectionView: UICollectionView) -> NSFetchedResultsController
  • superFetchedResultsController(entityName: NSString!, tableView: UITableView) -> NSFetchedResultsController
  • superFetchedResultsController(entityName: NSString!, sectionNameKeyPath: NSString?, sortDescriptors: NSArray?, predicate: NSPredicate?, collectionView: UICollectionView!, context: NSManagedObjectContext!) -> NSFetchedResultsController
  • superFetchedResultsController(entityName: NSString!, sectionNameKeyPath: NSString?, sortDescriptors: NSArray?, predicate: NSPredicate?, tableView: UITableView!, context: NSManagedObjectContext!) -> NSFetchedResultsController

使用以下方法创建的 NSFetchedResultsControllers 需要您使用自己的 NSFetchedResultsControllerDelegate

  • superFetchedResultsController(entityName: NSString!, sectionNameKeyPath: NSString?, sortedBy: NSString?, ascending: Bool, tableView: UITableView!, delegate: NSFetchedResultsControllerDelegate) -> NSFetchedResultsController
  • superFetchedResultsController(entityName: NSString!, sectionNameKeyPath: NSString?, sortedBy: NSString?, ascending: Bool, collectionView: UICollectionView!, delegate: NSFetchedResultsControllerDelegate) -> NSFetchedResultsController
  • superFetchedResultsController(entityName: NSString!, sectionNameKeyPath: NSString?, sortDescriptors: NSArray?, predicate: NSPredicate?, collectionView: UICollectionView!, delegate: NSFetchedResultsControllerDelegate) -> NSFetchedResultsController
  • superFetchedResultsController(entityName: NSString!, sectionNameKeyPath: NSString?, sortDescriptors: NSArray?, predicate: NSPredicate?, tableView: UITableView!, delegate: NSFetchedResultsControllerDelegate) -> NSFetchedResultsController
  • superFetchedResultsController(entityName: NSString!, sectionNameKeyPath: NSString?, sortDescriptors: NSArray?, predicate: NSPredicate?, collectionView: UICollectionView!, delegate: NSFetchedResultsControllerDelegate, context: NSManagedObjectContext!) -> NSFetchedResultsController
  • superFetchedResultsController(entityName: NSString!, sectionNameKeyPath: NSString?, sortDescriptors: NSArray?, predicate: NSPredicate?, tableView: UITableView!, delegate: NSFetchedResultsControllerDelegate, context: NSManagedObjectContext!) -> NSFetchedResultsController

开发者说明

整个项目处于持续开发中,是一个学习练习,并且已经提前发布以便可以从社区获得反馈。我在我每天工作的项目中使用它,希望它随着时间的推移会得到改进并增加更多功能、线程安全和错误处理。

目前正在进行替换 SuperCoreDataStack 的工作,以实现更好、更灵活和更简洁的实现,并获得在进行的 维基百科。如果您想帮忙,请与我们联系或提交一个 PR。