MFDynamic 消除了字符串型 User Defaults、NSCoding 装板代码等问题。
MFDynamicDefaults
以一种超级优雅的方式包装了 NSUserDefaults
NSCoding
的对象存档为 NSData
,并转换回对象,以便在用户默认值中进行无缝存储,包括您的自定编码的 NSCoding
对象。UIColor
和 NSColor
到 NSData
以及返回;一切都会自动完成。像这样与用户默认值进行交互
[[MYDefaults sharedDefaults] setBackgroundColor:newBackgroundColor];
UIColor *color = [[MYDefaults sharedDefaults] backgroundColor];
...而不是这样
FOUNDATION_EXPORT static NSString *MYBackgroundColorKey;
...
NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:MYBackgroundColor];
NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:MYBackgroundColor];
UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
MFDynamicDefaults
。为每个用户默认值定义 @dynamic
属性
接口
@interface MYAppDefaults : MFDynamicDefaults
@property BOOL autoPlayVoiceOver;
@property NSTimeInterval loginTimeoutInterval;
@property NSDate *lastUpdate;
@end
实现
@implementation MYAppDefaults
@dynamic autoPlayVoiceOver;
@dynamic loginTimeoutInterval;
@dynamic lastUpdate;
@end
使用您的 MYAppDefaults
类的共享实例来访问用户默认值
[[MYDefaults sharedDefaults] setAutoPlayVoiceOver:YES];
BOOL autoPlayVoiceOver = [[MYDefaults sharedDefaults] autoPlayVoiceOver];
类似于 NSUserDefaults
,MFDynamicDefaults
允许从字典中注册默认值。
NSDictionary *defaults = [NSDictionary dictionaryWithContentsOfFile:@"/Path/To/Plist/File"];
[[MYAppDefaults sharedDefaults] registerDefaults:defaults emitMissingDefaultValueWarnings:YES];
默认情况下,MFDynamicDefaults
在其动态属性中缺少默认值时会发出警告。这可以帮您记得为用户默认值提供默认值。可以通过在您的 MFDynamicDefaults
子类中实现 -shouldEmitWarningForProperty:
模板方法来为每个属性禁用警告。
MFDynamicStorage
与 MFDynamicDefault
的功能完全相同,但是使用简单字典作为其背后的存储而不是 NSUserDefaults
。使用 MFDynamicStorage
的主要用例是需要存储到磁盘上的模型类。您不需要使用“普通”的合成属性并手动实现 NSCoding
(这很容易出错且相当乏味),只需继承 MFDynamicStorage
并使用 @dynamic
属性即可。
MFDynamicStorage
。为必须存档的属性定义 @dynamic
接口
@interface MYModelClass : MFDynamicStorage
@property UIColor *backgroundColor;
@property float brightness;
@property NSURL *someURL;
@property (copy) NSString *propertyThatWontBeArchived;
@end
实现
@implementation MYModelClass
@dynamic backgroundColor;
@dynamic brightness;
@dynamic someURL;
// Because "propertyThatWontBeArchived" is not defined as @dynamic,
// it acts as a normal synthesized property and won't be saved to disk.
@end
使用零 NSCoding
样板代码将对象保存到磁盘和从磁盘加载
[modelClass saveToFile:@"/Users/Michael/Desktop/MyFile"];
MYModelClass *modelClass = [MYModelClass loadFromFile:@"/Users/Michael/Desktop/MyFile"];
assign
、copy
、weak
和strong
)都被忽略(这也是为什么在上面的示例中没有看到它们的原因)。该规则的唯一例外是readonly
。如果属性声明为readonly
,则MFDynamicBase不会为该属性实现setter。当MFDynamic将对象存储在其后端存储中(无论它是NSUserDefaults
如MFDynamicDefaults
还是简单的NSDictionary
如MFDynamicStorage
)时,它会通过将属性名称的首字母大写来存储,并将得到的字符串用作键。
属性名称 | 用户默认键 | 说明 |
---|---|---|
launchAtStartup | LaunchAtStartup | 首字母已大写(建议的Objective-C风格) |
MYSuperPropertyName | MYSuperPropertyName | 键与属性名称相同,因为首字母已经大写 |
MySuperPropertyName | MySuperPropertyName | 键与属性名称相同,因为首字母已经大写 |
Michaël Fortin ([email protected])
MFDynamic在MIT许可下可用。有关更多信息,请参阅LICENSE文件。