MFDynamic 1.2.1

MFDynamic 1.2.1

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2015 年 11 月

Michaël Fortin 维护。



MFDynamic 1.2.1

MFDynamic 消除了字符串型 User Defaults、NSCoding 装板代码等问题。

MFDynamicDefaults

MFDynamicDefaults 以一种超级优雅的方式包装了 NSUserDefaults

  • 通过简化语法让访问用户默认值更加轻松(见下文)。
  • 通过动态实现属性,从用户默认值系统中设置和检索值变得更加 类型安全
  • 消除了创建常量或重复编码用户默认值键字符串的需要。
  • 自动将遵循 NSCoding 的对象存档为 NSData,并转换回对象,以便在用户默认值中进行无缝存储,包括您的自定编码的 NSCoding 对象。
  • 不需要手动转换 UIColorNSColorNSData 以及返回;一切都会自动完成。
  • 一些类型会透明地转换为人类可读格式并返回,以便在 Plist 编辑器(如颜色和 URL)中进行易于编辑的存储。
  • 通过在注册默认值时发出警告,帮助您记住为您的注册默认值提供默认值(可选)。

像这样与用户默认值进行交互

[[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];

使用

  1. 继承 MFDynamicDefaults
  2. 为每个用户默认值定义 @dynamic 属性

    接口

    @interface MYAppDefaults : MFDynamicDefaults
    
    @property BOOL autoPlayVoiceOver;
    @property NSTimeInterval loginTimeoutInterval;
    @property NSDate *lastUpdate;
    
    @end

    实现

    @implementation MYAppDefaults
    
    @dynamic autoPlayVoiceOver;
    @dynamic loginTimeoutInterval;
    @dynamic lastUpdate;
    
    @end
  3. 使用您的 MYAppDefaults 类的共享实例来访问用户默认值

    [[MYDefaults sharedDefaults] setAutoPlayVoiceOver:YES];
    
    BOOL autoPlayVoiceOver = [[MYDefaults sharedDefaults] autoPlayVoiceOver];

注册默认值

类似于 NSUserDefaultsMFDynamicDefaults 允许从字典中注册默认值。

NSDictionary *defaults = [NSDictionary dictionaryWithContentsOfFile:@"/Path/To/Plist/File"];
[[MYAppDefaults sharedDefaults] registerDefaults:defaults emitMissingDefaultValueWarnings:YES];

默认情况下,MFDynamicDefaults 在其动态属性中缺少默认值时会发出警告。这可以帮您记得为用户默认值提供默认值。可以通过在您的 MFDynamicDefaults 子类中实现 -shouldEmitWarningForProperty: 模板方法来为每个属性禁用警告。

MFDynamicStorage

MFDynamicStorageMFDynamicDefault 的功能完全相同,但是使用简单字典作为其背后的存储而不是 NSUserDefaults。使用 MFDynamicStorage 的主要用例是需要存储到磁盘上的模型类。您不需要使用“普通”的合成属性并手动实现 NSCoding(这很容易出错且相当乏味),只需继承 MFDynamicStorage 并使用 @dynamic 属性即可。

使用

  1. 继承 MFDynamicStorage
  2. 为必须存档的属性定义 @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
  3. 使用零 NSCoding样板代码将对象保存到磁盘和从磁盘加载

    [modelClass saveToFile:@"/Users/Michael/Desktop/MyFile"];
    
    MYModelClass *modelClass = [MYModelClass loadFromFile:@"/Users/Michael/Desktop/MyFile"];

实现细节

  • 几乎所有Objective-C值类型均受支持。当属性类型不支持时,会抛出异常。如果您发现缺少所需的类型,请随时发送一个拉取请求;实现额外类型的支持非常简单。
  • 大多数属性修饰符(如assigncopyweakstrong)都被忽略(这也是为什么在上面的示例中没有看到它们的原因)。该规则的唯一例外是readonly。如果属性声明为readonly,则MFDynamicBase不会为该属性实现setter。

属性名称 <---> 用户默认键映射

当MFDynamic将对象存储在其后端存储中(无论它是NSUserDefaultsMFDynamicDefaults还是简单的NSDictionaryMFDynamicStorage)时,它会通过将属性名称的首字母大写来存储,并将得到的字符串用作键。

属性名称 用户默认键 说明
launchAtStartup LaunchAtStartup 首字母已大写(建议的Objective-C风格)
MYSuperPropertyName MYSuperPropertyName 键与属性名称相同,因为首字母已经大写
MySuperPropertyName MySuperPropertyName 键与属性名称相同,因为首字母已经大写

安装

作者

Michaël Fortin ([email protected])

许可

MFDynamic在MIT许可下可用。有关更多信息,请参阅LICENSE文件。