iOS - 用于添加朋友的Parse.com PFRelation仅添加当前用户的关系,而不是添加的朋友

时间:2014-03-15 19:39:21

标签: ios iphone objective-c parse-platform pfrelation

我的应用有一个视图控制器,用户可以在其中添加好友。该应用程序访问用户的地址簿,并调用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对于当前登录的用户。

但是这需要扫描整个数据库,看起来像是一个效率低下的修复程序,随着数据库的增长,将来会很慢。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

如果您需要修改任何非当前用户的用户数据,您应该使用CodeCloud函数和Parse.Cloud.useMasterKey();这种方式将绕过所有ACL。