我的应用有一个视图控制器,用户可以在其中添加好友。该应用程序访问用户的地址簿,并调用Parse.com后端服务器以查看是否有任何地址簿联系人已在使用该应用程序。如果找到任何,那么我将这些用户的PFObject放在我的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代码来创建修复程序。见user2:
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对于当前登录的用户。
但是这需要扫描整个数据库,看起来像是一个效率低下的修复程序,随着数据库的增长,将来会很慢。
感谢您的帮助。
答案 0 :(得分:2)
如果您需要修改任何非当前用户的用户数据,您应该使用CodeCloud函数和Parse.Cloud.useMasterKey();这种方式将绕过所有ACL。