AppFolder 0.2.0

AppFolder 0.2.0

Oleg Dreyman 维护。



AppFolder 0.2.0

logo

AppFolder

Swift Platform Build Status

AppFolder是一个轻量级框架,它允许您设计一个友好的、强类型的应用容器内部目录表示。所有系统目录,如“Caches/”“Application Support/”已经存在,您只需要几行代码就可以添加您自己的目录。

AppFolder有一个简单而美观的界面,得益于Swift的黑暗魔法:继承😱

如果您想了解更多关于这个想法的信息,请查看Medium上的介绍AppFolder

使用方法

import AppFolder

let documents = AppFolder.Documents
let caches = AppFolder.Library.Caches
let cachesURL = caches.url

extension Library.Caches {
    
    class Images: Directory { }
    
    var Images: Images {
        return subdirectory()
    }
    
}

let imageCache = AppFolder.Library.Caches.Images
let imageCacheURL = imageCache.url

指南

您的应用文件夹

let documents = AppFolder.Documents
let tmp = AppFolder.tmp
let applicationSupport = AppFolder.Library.Application_Support
let caches = AppFolder.Library.Caches

caches.url // full URL
caches.folderName // "Caches"
caches.subpath // "Library/Caches"

caches.baseURL
// the same as
AppFolder.baseURL

let fileURL = caches.url.appendingPathComponent("cached-file.json")

AppFolder表示您应用容器的文件结构,并帮助您更好地理解文件存储的位置。AppFolder是进入您的文件夹的主要入口点。在内部您可以找到

  • 文档AppFolder.Documents)。在这个目录中,您应该只存储"仅文档和其他用户生成或无法由您的应用程序重新创建的数据"。 - iOS数据存储指南
  • Library/Application Support (AppFolder.Library.Application_Support). "应用程序支持目录是一个存放文件的好地方,这些文件可能会放在您的文档目录中,但不应该让用户看到。例如,应用程序需要但用户永远不会手动打开的数据库。" - iOS 存储最好的做法
  • Library/Caches (AppFolder.Library.Caches). 缓存目录是存放 "...可以再次下载或重新生成的数据...你应该将数据库缓存文件和可下载内容(如杂志、报纸和地图应用程序使用的内容)放到缓存目录中。" - iOS 数据存储指南
  • tmp (AppFolder.tmp). "请使用此目录来写入不需要在应用程序启动之间持久化的临时文件。你的应用程序应在不再需要这些文件时从该目录中删除它们;但是,当应用程序没有运行时,系统可能会清除此目录。" - 文件系统编程指南

添加自己的文件夹

假设我们想在 "Application Support" 目录中声明一个 "Files" 文件夹。

实际上,AppFolder 中的每个文件夹都被表示为一个具体的 Directory 子类。例如,"Application Support" 的类型是 Library.Application_Support。为了声明自己的文件夹,我们需要创建一个新 Directory 子类

final class Files : Directory { }

默认情况下,文件夹名称将从类名称自动生成。

现在我们可以用非常直接的方式访问我们新文件夹

let filesFolder = AppFolder.Library.Application_Support.appending(Files.self)

但是,如果我们想得到更多一点的类型安全性,我们应该把这个逻辑放入扩展中

extension Library.Application_Support {
    
    final class Files : Directory { }
    
    var Files: Files {
        return subdirectory()
    }
    
}

现在,你可能想知道:既然 var Files 是一个属性,为什么 var Files... 要大写?

嗯,这是一个故意的 AppFolder 设计决策。为了尽可能准确地表示文件夹结构,所有属性都必须按照它们的真实世界名称(用 _ 代替空格)来编写。所以,例如,"Documents"AppFolder.Documents"tmp"AppFolder.tmp - 就像在“现实世界”一样。

_ 命名类(例如,class User_Files : Directory)将自动生成带有空格的文件夹名称(在这种情况下是“User Files”)

所以这部分应该是清楚的。现在我们可以完全直观地使用我们的文件夹

let files = AppFolder.Library.Application_Support.Files
let filesURL = files.url

重要:描述文件夹不会自动创建它们。AppFolder 为在代码中组织文件夹结构提供了方法,而不是在磁盘上主动管理它。为了使用,所有非系统目录都应该使用 FileManager.default.createDirectory(at:) 或类似 API 显式创建。

使用 AppFolder 与应用组结合

AppFolder 还支持通过 AppGroupContainer 与应用组共享容器。

enum MyAppGroup : AppGroup {
    static var groupIdentifier: String {
        return "group.com.my-app.my-app-group"
    }
}

let sharedCaches = AppGroupContainer<MyAppGroup>.Library.Caches

这样,例如,您可以在不失去对过程控制的情况下简化共享 Core Data 栈的创建。

let applicationSupportURL = AppGroupContainer<MyAppGroup>.Library.Application_Support.url
let sqliteFileURL = applicationSupportURL.appendingPathComponent("db.sql")
let model = NSManagedObjectModel(contentsOf: sqliteFileURL)
let container = NSPersistentContainer(name: "my-app-db", managedObjectModel: model!)

要了解更多关于应用组的信息,请查阅应用扩展编程指南:处理常见场景(章节“与您的容器应用共享数据”)。

自定义文件夹名称

如果您不满意自动生成的名称,可以提供自己的。

final class CustomNamedFolder : Directory {
    override var folderName: String {
        return "Custom"
    }
}

在 macOS 上使用 AppFolder

AppFolder 在底层使用 NSHomeDirectory(),因此,根据您的 macOS 应用,它可能只是将您定位到用户的家目录,正如文档所说明的。

在 macOS 上,它是应用程序的沙盒目录或者当前用户的家目录(如果应用程序不在沙盒中)。

NSHomeDirectory() 参考资料

AppFolder.tmp 在 macOS 上也已过时,因为它可能给出的结果与 NSTemporaryDirectory() 不同。为了在 macOS 上使用临时目录,我们建议使用 FileManager.default.temporaryDirectory

免责声明

AppFolder 处于一个非常早期的阶段。某些功能可能会在某个时刻出现损坏。

安装

AppFolder 可通过 Carthage 获得。要安装,只需将以下内容写入您的 Cartfile:

github "dreymonde/AppFolder" ~> 0.1.0

AppFolder 也可通过 CocoaPods 获得。

pod 'AppFolder', '~> 0.1.0'

以及 Swift 包管理器

dependencies: [
    .Package(url: "https://github.com/dreymonde/AppFolder.git", majorVersion: 0, minor: 1),
]