我的应用程序有一个视图控制器,用户可以在其中添加朋友。该应用程序访问用户的通讯录,并调用 Parse.com 后端服务器以查看是否有任何通讯录联系人已在使用该应用程序。如果找到,那么我将这些用户的 PFObjects 放在我的 UITableView 的行中。
表格中的每一行都有一个按钮。如果用户按下一行的按钮,则执行以下代码,该代码创建一个名为 friendsRelation 的 PFRelation 对象,并添加已被点击的特定行的 PFObject:
PFRelation *friendsRelation = [self.currentUser relationforKey:@"friendsRelation"];
PFUser *user = [self.allUsersInParse objectAtIndex:indexPath.row];
[friendsRelation addObject:user];
[self.currentUser saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if(error) {
NSLog(@"%@ %@", error, [error userInfo]);
}
}];
这在大多数情况下都很好用。如果我在 Parse 中检查当前用户的行,然后单击他们的 friendsRelation 列/键中的“查看关系”按钮,它将显示他们刚刚添加的正确用户的信息。
但是,如果我回到主 _User 类,找到当前用户添加的朋友所在的行,然后单击他们的 friendsRelation 列/键中的“查看关系”按钮,它不包含用户数据对于刚刚添加它们的当前用户。
因此,基本上,如果您将某人添加到您的朋友列表中,他们会很好地显示在您的朋友列表中,但是如果您的新朋友去查看他们的朋友列表,您将根本不在那儿。
我尝试通过为当前用户添加的用户添加额外的 PFRelation 代码来创建修复程序。见用户2:
PFRelation *friendsRelation = [self.currentUser relationforKey:@"friendsRelation"];
PFUser *user = [self.allUsersInParse objectAtIndex:indexPath.row];
NSLog(@"USER CONTENTS ON BUTTON PRESS: %@", user);
[friendsRelation addObject:user];
[self.currentUser saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if(error) {
NSLog(@"%@ %@", error, [error userInfo]);
}
PFUser *user2 = [self.allUsersInParse objectAtIndex:indexPath.row];
PFRelation *friendsRelation2 = [user2 relationforKey:@"friendsRelation"];
[friendsRelation2 addObject:self.currentUser];
[user2 saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error2) {
if(error2) {
NSLog(@"%@ %@", error2, [error2 userInfo]);
}
}];
此代码在技术上是正确的,但现在是允许的。Parse 向控制台打印一个错误,基本上说您不允许为尚未通过登录或注册进行身份验证的用户添加 PFRelation。
有人对我如何使这项工作有任何想法吗?
我唯一想到的是,当添加的朋友登录到应用程序时,我可以在 Parse 中查询数据库中包含其 objectId 的任何 friendsRelation 对象,如果找到,那么我可以为当前创建一个新的 PFRelation登录用户。
但这需要扫描整个数据库,而且似乎是一种效率低下的修复方法,将来随着数据库的增长会变慢。
谢谢您的帮助。