在 iOS 应用程序中更新 PFObject 的密钥时,需要从 Parse Cloud Code 保存和登录时运行代码

Posted

技术标签:

【中文标题】在 iOS 应用程序中更新 PFObject 的密钥时,需要从 Parse Cloud Code 保存和登录时运行代码【英文标题】:Need to run code on save and log from Parse Cloud Code when updating PFObject's key in iOS app 【发布时间】:2014-07-15 00:21:49 【问题描述】:

我有一个PFObject,它有一个数组键。我可以在这个PFObject 上成功调用addObject:,并且可以使用NSLog 确认该对象已正确添加到数组键中。但是,当我尝试将 PFObject 保存到 Parse 时,即使它说一切都成功了,但更改不会显示在数据浏览器中。

我已经尝试了所有方法,甚至可以让它在我的应用程序的旧版本中工作,但由于某种原因它不再工作了。

我发布了另一个关于 here 的 *** 问题

我得到的唯一回应是一些 cmets 说我应该触发“保存前”功能并通过 Cloud Code 记录所有内容。问题是我不懂 javascript,而且我一直在乱用 Cloud Code,但什么也没发生。

这是我在我的应用程序中执行的代码:

[self.message addObject:currentUsersObjectId forKey:@"myArrayKey"];

然后我使用saveInBackgroundWithBlock:

我需要更改云代码,以便在保存和记录结果之前检查self.message 对象的"myArrayKey"

编辑 2:

这是我创建 currentUsersObjectId 的方法:

NSString *currentUsersObjectId = [[NSString alloc]init];

PFUser *user = [PFUser currentUser];

currentUsersObjectId = user.objectId;

编辑 3:

这是保存块

[self.message saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) 
    if (error) 
        NSLog(@"An error has occurred.");
     
];

编辑 4:

添加 Timothy 的云代码后,saveInBackgroundWithBlock: 现在没有成功完成。相反,会发生错误,并且错误对象 NSLogs 为“错误:未捕获尝试使用指向新的未保存对象的指针保存对象。(代码:141,版本:1.2.17)”以及:

Error Domain=Parse Code=141 "The operation couldn’t be completed. (Parse error 141.)" UserInfo=0x15dc4550 code=141, error=Uncaught Tried to save an object with a pointer to a new, unsaved object. 
    code = 141;
    error = "Uncaught Tried to save an object with a pointer to a new, unsaved object.";

这是我添加 Timothy 代码后的完整云代码文件:

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

    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)
    );
);

Parse.Cloud.beforeSave("Messages", function(request, response) 
    var message = request.object;

    // output just the ID so we can check it in the Data Browser
    console.log("Saving message with ID:", message.id);
    // output the whole object so we can see all the details including "didRespond"
    console.log(message);

    response.success();
);

// log the after-save too, to confirm it was saved
Parse.Cloud.afterSave("Messages", function(request, response) 
    var message = request.object;

    // output just the ID so we can check it in the Data Browser
    console.log("Saved message with ID:", message.id);
    // output the whole object so we can see all the details including "didRespond"
    console.log(message);

    response.success();
);

【问题讨论】:

请显示您保存的完整代码,您其他问题的日志记录 cmets 是帮助您调试问题的建议。还请提供列类型的详细信息(是myArrayKey 类型为Array<string>Array<_User> 等)。 需要查看您的 ios 代码(从那里获得 currentUsersObjectId 到您的保存块),您可以从您的问题中删除该云代码,因为它完全不相关。 请看我的第二次编辑。 .. 和完整的保存块?到目前为止,一切看起来都很好(只要有当前用户)。考虑在任何地方放置 NSLog 语句以确认一切都符合预期(用户、currentUsersOjbectId、self.message、成功/错误代码等)。 我刚刚添加了保存块。我已经 NSLogged 一切。成功返回真实,没有错误,一切都是 NSLogs。即使在保存之前,如果我 NSLog self.message 它会显示添加到键的值。这没有任何意义。 【参考方案1】:

经过多次反复,我很困惑为什么这对你不起作用。至于登录 Cloud Code,如果您按照添加代码的指南进行操作,您可以将以下内容添加到您的 main.js 并进行部署:

Parse.Cloud.beforeSave("Messages", function(request, response) 
    var message = request.object;

    // output just the ID so we can check it in the Data Browser
    console.log("Saving message with ID:", message.id);
    // output the whole object so we can see all the details including "didRespond"
    console.log(message);

    response.success();
);

// log the after-save too, to confirm it was saved
Parse.Cloud.afterSave("Messages", function(request, response) 
    var message = request.object;

    // output just the ID so we can check it in the Data Browser
    console.log("Saved message with ID:", message.id);
    // output the whole object so we can see all the details including "didRespond"
    console.log(message);

    response.success();
);

有了这些,您就可以检查大量服务器端日志记录。

【讨论】:

嘿,请查看我添加的名为 Edit 4 的编辑。我根据您的回答更改了我的云代码文件,现在 saveInBackgroundWithBlock 不再工作。 对,现在我们终于得到了真正的错误。您需要列出您在该“消息”类上设置的每个属性,因为其中一个尚未保存并导致问题。 其实我只是想通了。【参考方案2】:

除了蒂莫西的答案之外,我还添加了我自己的答案,以防其他人遇到类似的问题。我的应用程序使用以下库来允许使用 NSUserDefaults 存储解析对象:https://github.com/eladb/Parse-NSCoding

无论出于何种原因,在解压缩解析对象后,它们都无法正确保存到 Parse 数据库中。我必须使用未归档对象的 objectId 查询数据库并检索对象的新版本,然后才能成功更改并保存检索到的对象。

我不知道为什么现在会发生这种情况。直到大约两周前,当我尝试部署新版本的云代码时,我才遇到任何问题,如果我没记错的话,Parse 希望我在部署之前更新 Parse SDK 或云代码版本。

这些更改不得与这些类别兼容。

【讨论】:

以上是关于在 iOS 应用程序中更新 PFObject 的密钥时,需要从 Parse Cloud Code 保存和登录时运行代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中保存 PFObject 列表?

在 Swift 中子类化 PFObject

PFObject 上传标志

最终使用 PFFile(解析本地数据存储)保存在 PFObject 上?

更新查询对象上的 Parse ACL

iOS - 解析当前用户获取不起作用