在 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 保存和登录时运行代码的主要内容,如果未能解决你的问题,请参考以下文章