为 Parse iOS SDK 提供无忧数据模型。
ParseModel
类自动将子类的属性映射到底层 PFObject
的条目中,并处理任何必要的转换(例如,如果您的属性是 int
,它将被转换为用于存储的 NSNumber
)。
通过 CocoaPods: pod 'ParseModel'
截至 2013 年 3 月,Parse iOS SDK 已内置此功能。有关更多信息,请参阅此 博客文章。无论如何,这个存储库对我很有帮助,如果原生 Parse iOS SDK 中没有找到这些功能,我将继续为其添加功能。
Parse 是一个云后端作为服务的平台(或者称为 Baas),允许开发者快速将应用上线并运行,无需或几乎无需设置后端。
更多时候,我们开发者喜欢使用自己的类,而不使用这些服务中包含的现成数据模型。无论是哪种方法,我们最终都需要将对象的属性映射到后端对象。有时我们通过类似这样的属性获取器和设置器覆盖来实现
@interface MyObject : NSObject
@property (nonatomic, strong) NSString *someString;
@property (nonatomic, strong) PFObject *parseObject;
@end
@implementation MyObject
- (NSString *)someString
{
return [self.parseObject objectForKey:kSomeStringKey];
}
- (NSString *)setSomeString:(NSString *)someString
{
[self.parseObject setObject:someString forKey:kSomeStringKey];
}
@end
这种方法的好处是我们可以在 Objective-C 协议
中定义这些属性,并让我们的模型对象遵守此协议
@interface MyObject : NSObject <MyObjectProtocol>
@property (nonatomic, strong) PFObject *parseObject;
@end
现在在我们的应用程序代码中,我们只需要处理 id<MyObjectProtocol>
指针,而不用担心具体细节。这种优势很明显...
但是,设置像这样的模型很费时。没有人喜欢书写获取器/设置器、创建大量的静态密钥等。
这正是 ParseModel 发挥作用的地方。
Parse Model 是基于 CouchCocoa 的一个想法,只要你创建一些 属性
并将它们设为 dynamic
,就可以创建一个模型对象。就是这样。在我们的例子中,所有 属性
都会映射到一个底层的 PFObject
,并且使用相同的键作为值。
以下是一个示例
@interface MyObject : ParseModel
@property (nonatomic, strong) NSString *someString;
@property (nonatomic, strong) NSString *someOtherString;
@end
@implementation MyObject
@dynamic someString;
@dynamic someOtherString;
+ (NSString *)parseModelClass
{
return @"MyObject";
}
@end
在声明上述 MyObject
类之后,我们可以进行如下操作
MyObject *myObject = [MyObject parseModel];
myObject.someString = @"Hello there";
[myObject.parseObject saveInBackground];
当 someString
设置时,它将自动映射到底层的 PFObject
。
最后,你可以使用以下方法创建模型
+ (id)modelWithParseObject:(PFObject *)parseObject;
还有一个带有 PFUser
味道的对象,叫做 ParseModelUser
。
ParseModel 目前支持所有 PFObject
支持的 类型。这意味着不要尝试使用 UIImage 并期望它能工作!如果你需要存储 UIImage 数据(或不受支持的内容),你有几种替代方案
首先,让我说,如果没有 Jens Alfke,可能就不会发生这一切。他写了几乎所有的代码。我只是将其适用于 Parse。大部分代码都是从他的 CouchModel 类中提取的。
在底层,当我们尝试访问一个尚未创建的属性(因为我们的情况中有 dynamic
关键字),我们会捕获一个最后的努力消息给我们的类:“嘿,我们找不到这个实例方法”。如果我们检测到它是一个作为动态声明的属性的设置器或访问器方法,我们就使用一个预定义的代码块在程序中动态创建 getter/setter,该代码块使用 PFObject
来存储/检索值。这就是要点。有关更多信息,请参阅 Dynamic Method Resolution。
Jens 编写的原始代码是在 Apache 许可协议,版本 2.0 下发布的。