AppFolder
AppFolder是一个轻量级框架,它允许您设计一个友好的、强类型的应用容器内部目录表示。所有系统目录,如
AppFolder有一个简单而美观的界面,得益于
如果您想了解更多关于这个想法的信息,请查看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 上,它是应用程序的沙盒目录或者当前用户的家目录(如果应用程序不在沙盒中)。
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),
]