JSBFilesystem 0.8.3

JSBFilesystem 0.8.3

Jeffrey Bergier 维护。



  • jeffreybergier

Xcode: 10.0 Language: Objective C Annotations: for Swift iOS: 8.0+ macOS: 10.11+

JSBFilesystem

描述

这是一个小型库,使您能够轻松显示在本地设备磁盘上存在的文件数据。该库还便于监视文件的添加、删除和修改操作,以便您能保持 TableViews、CollectionViews 或任何用户界面处于最新状态。当文件发生变化时,该库使用 NSFilePresenter 来接收来自操作系统的通知,然后使用 IGListKit 来比较新旧内容。

该库还提供了一组丰富的辅助方法,位于 NSFileCoordinator 上。这些辅助方法与典型的 Swift 错误处理一起工作,而不是与 NSFileCoordinator,这大大减少了在多个进程可能同时访问文件时需要的安全读取和写入文件时的样板代码。

该库 100% 由 Objective-C 编写。这是为了减少桥接开销。在读取、排序和过滤 URL 的数组时,在 NSArray 到 Array 之间切换的开销可能相当高。尽管是用 Objective-C 编写的,但有足够的注释,所以一切在 Swift 中都感觉非常自然。

示例应用程序和演示视频

项目中包含一个小型示例应用程序。该应用程序展示了如何轻松地读取、写入、删除和修改文件,同时在 UITableView 中显示它们并以适当的动画方式显示更改。查看这个示例应用程序的 代码文件 看起来有多小。 播放:示例应用程序演示视频

重要分类

JSBFSDirectory

提供基本API,以兼容TableView方式访问目录。该类提供目录中文件的定制排序过滤

  • TableView的重要方法
    • -(NSInteger)contentsCount
      • numberOfRowsInSection:中使用
    • (NSURL*)urlAtIndex:error
      • cellForRowAtIndexPath:中使用
      • 使用[+NSFileCoordinator JSBFS_readDataFromURL:error:]获取可以反序列化为您的模型对象实例的数据。注意:每次调用该类上的任何方法时,都需要获取、排序和过滤目录中的每个URL。这使得它不适用于频繁访问。它也不提供任何文件在磁盘上更改时的更新功能。要解决这两个问题,请参阅JSBFSObservedDirectory

JSBFSObservedDirectory

JSBFSDirectory的子类,增加订阅文件系统变化的能力。一旦订阅,排序和过滤后的目录内容将内部缓存以便快速访问。当磁盘上发生更新时,新内容将与当前缓存的现有内容进行差异比对。如果有差异,则执行带有更改的changesOcurred块,您可以更新您的UI。

  • TableView的重要属性
    • changesObserved
      • 每当观察到的子文件发生更改时执行此块。查看示例应用代码了解如何使用此属性进行带有UITableView的批量更新。
      • 注意:当此属性为nil时,对象的行为与其超类相同。一旦设置,其行为就会改变,因为它构建一个内部缓存,这极大地加快了-(NSInteger)contentsCount:(NSURL*)urlAtIndex:error:和其他方法的速度。
      • 注意:一旦设置此属性,ObservedDirectory对象会被添加到NSFilePresenter进行更新。NSFilePresenter持有表示对象的强引用。您必须手动将其设置为nil,否则可能会导致内存泄漏。
      • 注意:此对象持有该块的强引用。在块内部引用self时要小心,以免创建保留周期。
    • changeKind
      • 一个枚举(JSBFSObservedDirectoryChangeKind),它告诉这个对象如何在更新发生时如何差异目录内容。一些集合视图类型支持在批处理更新期间重新加载行,而其他则不支持。例如,NSOutlineView 支持在批处理更新期间重新加载行,但 UICollectionView 则不支持。
      • 根据此枚举的值,changesObserved 块将执行一个 JSBFSDirectoryChanges 或一个 JSBFSDirectoryChangesFull 对象。前者将文件修改表示为插入和删除,并支持 UICollectionView 和类似视图。后者包括通常的修改并可与 NSOutlineView 和类似视图一起使用。

NSFileCoordinator+JSBFS.h

此文件包含了一系列对 NSFileCoordinator 的辅助方法,这些方法使得使用 NSFileCoodinator 变得更加容易。它们还统一支持 Swift 错误处理,与 NSFileCoordinator 不同的是,它们可以使用 try、catch。

  • 重要方法
    • +(BOOL)JSBFS_writeData:toURL:filePresenter:error
    • +(BOOL)JSBFS_writeFileWrapper:toURL:filePresenter:error
    • +(NSData*)JSBFS_readDataFromURL:filePresenter:error
    • +(NSData*)JSBFS_readFileWrapperFromURL:filePresenter:error
    • +(BOOL)JSBFS_readAndWriteDataAtURL:afterTransformdingWithBlock:filePresenter:error
    • +(BOOL)JSBFS_readAndWriteFileWrapperAtURL:afterTransformdingWithBlock:filePresenter:error

NSFileWrapper

这是一个苹果的非常棒的 API,它允许轻松地读写 文档“包”。 NSFileWrapper 完全由 NSFileCoordinator+JSBFS 支持。针对每个基于 NSData 的方法都有对应的方法。这允许读写无法序列化为单个 NSData 块的非常复杂的文件。

此 API 略有复杂,但请看以下示例。这将创建一个包含子 PLIST 数据负载和子 PNG 图像负载的新文档包。最后一行代码将文档包写入磁盘。如果你在写入此代码后将文件系统进行了检查,你将在该文件夹中看到一个包含 payload.plistimage.png 文件的文件夹。

do {
    let payloadData = try self.model.plistData()
    let payloadWrapper = FileWrapper(regularFileWithContents: payloadData)
    payloadWrapper.preferredFilename = "payload.plist"
    let imageData = try self.model.image.pngData()
    let imageWrapper = FileWrapper(regularFileWithContents: imageData)
    imageWrapper.preferredFilename = "image.png"
    let parentWrapper = FileWrapper(directoryWithFileWrappers: [
        "payload.plist": payloadWrapper,
        "image.png": imageWrapper
        ])
    let fileURL = self.directory.appendingPathComponent(self.fileName)
    try NSFileCoordinator.JSBFS_write(parentWrapper, to: fileURL, filePresenter: nil)
} catch {
    let e = String(describing: error)
    NSLog(e)
}

行为准则

JSBFilesystem在GitHub上有一个行为准则,旨在为其社区提供安全保障。我们希望所有参与项目的人员,包括在问题、评论、拉取请求等任何方面的,都能感受到不受骚扰。每个人都必须相互尊敬,否则将会被社区禁止加入。如果你感到有人没有以尊重的态度对待你,请私下告诉我

贡献指南

我很高兴其他人能为JSBFilesystem做出贡献。这是我第一个公开发布的通用库,我相信它还需要很多改进。

应做之事

  1. 应做:查看开放的问题,寻找你感兴趣解决的问题。
  2. 应做:如果没有相关的问题,创建一个新的问题。
  3. 应做:说明你打算着手解决这个问题。
  4. 应做:实现预期的功能及其基本测试。
  5. 应做:在问题中寻求帮助或指导,我会很高兴提供帮助。
  6. 应做:自由地改进文档和修复错别字,所有的贡献都是有价值的。

不应做

  1. 不应做:不要提交没有任何相关问题的拉取请求。
  2. 不应做:修改过程中不要违反App Store规则。
  3. 不应做:在没有商量的情况下,不要添加新的CocoaPod或其他第三方代码/资产。

检查现有问题

安装

Cocoapods

pod 'JSBFilesystem'