为了保持代码的可重用性(DRY),EDStorage 被创建出来以解决在 iOS 应用程序中将数据写入磁盘时产生的相当多的样板代码。iOS 中的磁盘 I/O 是同步的,因此这部分样板代码通常被写入以通过将 I/O 移到后台线程来提高性能。EDStorage 通过将每个写入实例转换为一个 NSOperation
来实现这一点,该操作由一个单独的 NSOperationQueue
管理。所有这些都在后台完成,同时通过类别提供高级方法。
EDStorage 努力提供以下三个功能:
开始使用 EDStorage 的最简单方法是查看附带的示例应用程序。Xcode 项目文件可以在 example > storage.xcodeproj
中找到。
为了将 EDStorage 添加到项目中,您将需要将 EDStorage
目录的整个内容添加到项目中。EDStorage 是建立在 foundation 库之上的,所以不需要额外的框架。要将所有包含的存储类别引入,只需
#import "EDStorage.h"
每个类别都有根据特定类的需求略有不同的接口,但为了举例,让我们来看看如何将一个 UIImage 持久化到应用程序缓存目录
- (void)doSomething
{
UIImage *image = [UIImage imageNamed:@"keyboardCat.png"];
[image persistToCache:^(NSURL *url, NSUInteger size) {
NSLog(@"FTW!: %@ | %d bytes", url, size);
} failure:^(NSError *error) {
NSLog(@"UH OH: %@", error);
}];
}
将数据持久化到临时和文档应用程序目录同样简单
[image persistToTemp:^(NSURL *url, NSUInteger size) {
NSLog(@"FTW!: %@ | %d bytes", url, size);
} failure:^(NSError *error) {
NSLog(@"UH OH: %@", error);
}];
[image persistToDocuments:^(NSURL *url, NSUInteger size) {
NSLog(@"FTW!: %@ | %d bytes", url, size);
} failure:^(NSError *error) {
NSLog(@"UH OH: %@", error);
}];
EDStorageManager
提供了一个用于与类别进行接口的单个块方法
- (void)persistData:(id)data withExtension:(NSString *)ext toLocation:(Location)location success:(void (^)(NSURL *url, NSUInteger size))success failure:(void (^)(NSError *error))failure;
类别只是通过处理将类实例转换为 NSData 对象来抽象化调用此方法在 EDStorageManager
上的过程。参见 NSData+Storage
实现。例如,UIImage 的存储类别仅通过调用 UIImageJPEGRepresentation()
将 self 传递给 NSData。
如果您创建了一个有用的类别,请让我知道!欢迎 Pull 请求。
EDStorageDirectoryCache
EDStorageDirectoryTemp
EDStorageDirectoryDocuments
- (void)persistToCacheWithExtension:(NSString *)extension success:(void (^)(NSURL *url, NSUInteger size))success failure:(void (^)(NSError *error))failure;
- (void)persistToTempWithExtension:(NSString *)extension success:(void (^)(NSURL *url, NSUInteger size))success failure:(void (^)(NSError *error))failure;
- (void)persistToDocumentsWithExtension:(NSString *)extension success:(void (^)(NSURL *url, NSUInteger size))success failure:(void (^)(NSError *error))failure;
- (void)persistToCache:(void (^)(NSURL *url, NSUInteger size))success failure:(void (^)(NSError *error))failure;
- (void)persistToTemp:(void (^)(NSURL *url, NSUInteger size))success failure:(void (^)(NSError *error))failure;
- (void)persistToDocuments:(void (^)(NSURL *url, NSUInteger size))success failure:(void (^)(NSError *error))failure;
- (void)persistToCache:(void (^)(NSURL *url, NSUInteger size))success failure:(void (^)(NSError *error))failure;
- (void)persistToTemp:(void (^)(NSURL *url, NSUInteger size))success failure:(void (^)(NSError *error))failure;
- (void)persistToDocuments:(void (^)(NSURL *url, NSUInteger size))success failure:(void (^)(NSError *error))failure;
EDStorage已在iOS 5及更高版本上进行测试。较旧版本的iOS可能也能工作,但当前不支持。
从v0.2.0版本开始,EDStorage使用ARC构建。如果您在项目中包含EDStorage,而该项目不使用自动引用计数(ARC),则需要将所有EDStorage源文件的编译器标志设置为-fobjc-arc
。要在Xcode中这样做,请转到您的活动目标并选择“构建阶段”选项卡。现在选择所有EDStorage源文件,按Enter键,输入-fobjc-arc
然后点击“完成”来启用EDStorage的ARC。