保存PFQuery结果时出错

时间:2014-06-26 17:39:22

标签: ios objective-c cocoa-touch parse-platform subclass

我有一个 Item ViewController ,带有一个按钮,可以与项目的所有者一起创建一个chatRoom。

-(void)createChatRoom
{

    PFQuery *queryForChatRoom = [PFQuery queryWithClassName:@"ChatRoom"];
    [queryForChatRoom whereKey:@"user1" equalTo:[PFUser currentUser]];
    [queryForChatRoom whereKey:@"user2" equalTo:self.Item.Owner];

    PFQuery *queryForChatRoomInverse = [PFQuery queryWithClassName:@"ChatRoom"];
    [queryForChatRoomInverse whereKey:@"user1" equalTo:self.Item.Owner];
    [queryForChatRoomInverse whereKey:@"user2" equalTo:[PFUser currentUser]];

    PFQuery *combinedChatRoomQuery = [PFQuery orQueryWithSubqueries:@[queryForChatRoom, queryForChatRoomInverse]];

    [combinedChatRoomQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if ([objects count] == 0){

            PFChatRoom *ChatRoom = [PFChatRoom objectWithClassName:@"ChatRoom"];
            [ChatRoom setObject:[PFUser currentUser] forKey:@"user1"];
            [ChatRoom setObject:self.Item.Owner forKey:@"user2"];
            [ChatRoom saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                [self performSegueWithIdentifier:@"ItemToChatSegue" sender:nil];
            }];
        }
    }];

}

当我按下按钮执行此代码时,我在任何给定的运行中都会在3,4,14,34的任何线程上发生错误。

[PFUser(Private) checkSaveParams]

我可以将[PFUser currentUser]和此ViewController的Item.Owner登录到控制台,因此可以使用对象。如果我在没有第二个用户的情况下尝试代码,我实际上可以保存到只有附加[PFUser currentUser]的Parse chatRoom对象。

我需要做些什么才能将非当前用户添加到此聊天室?

1 个答案:

答案 0 :(得分:0)

出于安全原因,Parse不允许当前用户修改您的第二个用户。如果您希望能够为第二个用户进行更改,则需要使用Cloud Code来解决此障碍。

之前我遇到过多个这样的问题,每次我都被迫通过Cloud Code使用解决方法。

以下是我在两个用户之间建立朋友关系所采取的解决方法示例:

[PFCloud callFunction:@"editUser" withParameters:@{@"userId": user.objectId}];

上面的代码语句在xcode中,并执行我添加到我的Cloud Code文件中的函数。

然后,这是我的Cloud Code文件的样子:

Parse.Cloud.define('editUser', function(request, response) {
    var userId = request.params.userId;

    var User = Parse.Object.extend('_User'),
        user = new User({ objectId: userId });

    var currentUser = request.user;

    var relation = user.relation("friendsRelation");
    relation.add(currentUser);

    Parse.Cloud.useMasterKey();
    user.save().then(function(user) {
        response.success(user);
    }, function(error) {
        response.error(error)
    });
});

上面的代码使用主密钥来保存对当前登录用户以及将objectId传递给此函数的用户的更改。

代码详情:

var relation

这只是我创建的一个变量,用于保存以下功能:

user.relation("friendsRelation");

在上面的函数中,"friendsRelation"是Parse中PFRelation键的名称。

现在我们在名为relation的变量中包含了一个有效的关系对象,我们使用currentUser对象的参数执行此函数。

在此之后,剩下的就是保存所有内容。我没有用javascript编程,但我仍然能够通过查看Parse Cloud Code文档并在他们的支持论坛上搜索来提出上述解决方案。

如果您从上面获取我的模板,并根据您实际使用的Parse对象的类型进行一些小的更改,例如: ChatRoom,那么你应该能够轻松完成你所需要的。你只需要跳过这些额外的箍,因为Parse SDK不需要某人可以登录并以某种方式对另一个用户的帐户进行更改的情况,无论是他们自己的错还是开发人员的?错误。