Ios 解析-使用关系还是指针?

Ios 解析-使用关系还是指针?,ios,parse-platform,Ios,Parse Platform,我正在使用Parse作为后端。我在设置对象之间的正确关系时遇到问题 我基本上有一个名为Post的类,每个Post都属于一个用户(PFUser),在获取Post时,我希望用户信息与Post一起被获取 @interface Post : PFObject<PFSubclassing> @property (nonatomic, strong) NSDate *time; @property (nonatomic, strong) NSString *title; @property (

我正在使用Parse作为后端。我在设置对象之间的正确关系时遇到问题

我基本上有一个名为Post的类,每个Post都属于一个用户(PFUser),在获取Post时,我希望用户信息与Post一起被获取

@interface Post : PFObject<PFSubclassing>

@property (nonatomic, strong) NSDate *time;
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *body;
@property (nonatomic, strong, readonly) PFRelation *user;
// User in backed is defined as a relationship to _user    

@end

// Saving the post
[post.user addObject:[PFUser currentUser];
[post saveInBackground];
@界面帖子:PFObject
@属性(非原子,强)NSDate*时间;
@属性(非原子,强)NSString*标题;
@属性(非原子,强)NSString*体;
@属性(非原子、强、只读)PFRelation*用户;
//backed中的用户定义为与_User的关系
@结束
//拯救岗位
[post.user addObject:[PFUser currentUser];
[邮政储蓄背景];
这很好,可以将帖子与该用户关联,但当我稍后尝试获取帖子时,似乎无法从PFRelation获取_user的实例

正确的处理方法是什么?
试图将PFRelation更改为PFUser,但这会崩溃,因为它试图对PFUser对象调用save

您必须从PFRelation对象创建一个查询,如以下代码段(取自解析文档)中所示,并执行显式查询以检索引用的对象:


[[关系查询]findObjectsInBackgroundWithBlock:^(NSArray*对象,NSError*错误){
如果(错误){
//有一个错误
}否则{
//用户
}
}];

Parse提供了在原始查询中也检索引用对象的可能性,这是使用原始查询中的“includeKey:”方法完成的(即您为获取帖子而设置的查询),要求返回用户数据,而不仅仅是引用。但我不确定它是否适用于PFRelation,因为文档中说明includeKey适用于PFObject,PFRelation不是PFObject。您可以在任何情况下尝试此代码,看看它是否适用:


[查询includeKey:@“用户”]

当您需要一个相关类的长列表,数组不起作用时,或者当您希望根据需要查询相关对象,而不是在每次加载包含对象时都包含该列表时,可以使用关系

基本上,您有4个解析选项:

  • 指针-对另一个类的单个引用(1到0..1)
  • 数组-指针集合,每次加载对象(1到0..n,小列表)
  • 关系-指针的集合,如SQL中的联接表(在后台为您处理),您必须对其运行查询以加载值(1到0..n)
  • 自定义联接类-实际上只是另一个对象(如SQL中的多对多联接),其指针指向每一侧以及任何相关信息(1..n到1..n)

在您的情况下,一个简单的指针可以实现您想要的功能。

在您的用例中,指针优于PFRelation。您可以通过在查询中添加includeKey来包含用户信息:

[query includeKey:@"user"];
获取帖子评论数的一种方法是将每个新评论添加到帖子中的指针数组中

当您开始使用NoSQL数据库时,很容易陷入旧的SQLish方式。如果需要计数器,您可以在comment对象上添加cloud code afterSave函数,通过向“comments”添加指向已保存注释的指针来更新Post类的“comments”列数组。这样,当您获取帖子时,也可以使用

[query includeKey:@"comments"];

这将在一个查询中为您提供帖子和所有评论。如果您只需要计数,您可以使用includeKey,但“comments”中仍有一个带指针的数组,因此评论计数是数组的长度。

创建一个类似的pf子类

yourClassName:PFObject with PFSubclassing 
然后在头文件中创建一个指针关系

@property(nonatomic, strong) PFUser *userLikeRelation; 
在m文件中添加

+ (NSString *)parseClassName {

    return @"parseTableName";

}

+ (void)load {

    [self registerSubclass];

} 
最后,当您在解析中保存数据时,在查询中的视图控制器中设置关系

yourClassName *yourClassNameObj = [yourClassName objectWithClassName:[yourClassName parseClassName]];

[yourClassName setUserCommentRelation:[PFUser currentUser]];
对于获取数据,可以使用include键获取数据

[yourClassNameObj includeKey:@"NameofRelation"];

感谢您的回复。我只是通过使用指针而不是关系,并将我的属性类型更改为PFUser来解决此问题。在我将其设置为关系之前,它试图更新PFUser。我认为这就是它抛出异常的原因。您认为我的方法更好吗?如果不是,原因是什么,您如何在这两者之间做出决定ers和关系?我也使用直接类方法,即不使用PFRelation。根据解析文档,PFRelation非常适合N-to-M关系。它们所做的示例是,在社交应用程序中,每个用户可能喜欢多篇帖子,每个帖子可能被多个用户喜欢。因此,在您的情况下,当您将帖子链接到用户时(而不是viceversa)你可以使用直接的基于类的引用。但是如果你想建立反向关系,即1-many(1篇文章,很多喜欢它的用户)在这种情况下,最好使用PFRelation,而不是NSArrayThanks,这是一个很好的答案。是否可以执行查询并获取计数?或者在PFObject上添加导航属性以获得计数?比如获取一个包含相关评论数目的Post对象?@aryaxt Post的评论计数为ac实际上是文档中包含的内容。虽然您可以使用
countObjects
查询,但更容易使用一些云代码,在保存注释后增加帖子上的计数器(使用
incrementKey
)。