ParseModel 1.2.0

ParseModel 1.2.0

测试已测试
语言 Obj-CObjective C
许可证 自定义
发布最后发布2014年12月

Chris Constable 维护。



  • Christopher Constable 和 Jens Alfke 撰写

ParseModel-iOS

为 Parse iOS SDK 提供无忧数据模型。

ParseModel 类自动将子类的属性映射到底层 PFObject 的条目中,并处理任何必要的转换(例如,如果您的属性是 int,它将被转换为用于存储的 NSNumber)。

安装

通过 CocoaPods: pod 'ParseModel'

注意

截至 2013 年 3 月,Parse iOS SDK 已内置此功能。有关更多信息,请参阅此 博客文章。无论如何,这个存储库对我很有帮助,如果原生 Parse iOS SDK 中没有找到这些功能,我将继续为其添加功能。

为什么使用 ParseModel?

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> 指针,而不用担心具体细节。这种优势很明显...

  1. 我们有一个相对静态的数据处理接口(即后端可以按需更改,而我们的大部分代码保持不变)。
  2. 我们可以透明地使用连接到不同后端和服务的对象。
  3. 不言而喻。

但是,设置像这样的模型很费时。没有人喜欢书写获取器/设置器、创建大量的静态密钥等。

这正是 ParseModel 发挥作用的地方。

ParseModel 能做什么?

使用 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;

使用 ParseModelUser

还有一个带有 PFUser 味道的对象,叫做 ParseModelUser

局限性

ParseModel 目前支持所有 PFObject 支持的 类型。这意味着不要尝试使用 UIImage 并期望它能工作!如果你需要存储 UIImage 数据(或不受支持的内容),你有几种替代方案

这是如何工作的?

首先,让我说,如果没有 Jens Alfke,可能就不会发生这一切。他写了几乎所有的代码。我只是将其适用于 Parse。大部分代码都是从他的 CouchModel 类中提取的。

在底层,当我们尝试访问一个尚未创建的属性(因为我们的情况中有 dynamic 关键字),我们会捕获一个最后的努力消息给我们的类:“嘿,我们找不到这个实例方法”。如果我们检测到它是一个作为动态声明的属性的设置器或访问器方法,我们就使用一个预定义的代码块在程序中动态创建 getter/setter,该代码块使用 PFObject 来存储/检索值。这就是要点。有关更多信息,请参阅 Dynamic Method Resolution

许可

Jens 编写的原始代码是在 Apache 许可协议,版本 2.0 下发布的。