我试图找出从iOS客户端处理传入的saveAll批次的最佳方法。用户可以在应用程序中创建一些注释,如果他们离开应用程序或远离注释页面,则会批量保存所有注释对象。
在云代码中,我需要检查与评论相关联的组织的支持票据计数,然后增加组织对象的计数,并使用票号保存评论。
因此,假设保存2条评论时,它会获取票号,但会使用相同的票号保存两条评论。
ex:组织票数100 我们的客户使用saveAll函数添加了2条评论。
云代码应该获取组织票据计数,然后使用票证计数保存评论,增加组织票证计数并保存下一个等等。
这里有一些示例代码,我正在玩..一切正常但saveAll的评论都是用相同的组织票号保存的。
Parse.Cloud.beforeSave("Comment", function(request, response) {
// when a comment is added we get the current ticketNumber value
// from the org, and assign it to the new comment.
// after that we increment the counter on the org.
console.log('========================')
console.log(request.object.id) // empty
console.log(request.object.get('org'))
console.log('========================')
var orgId = request.object.get("org").id
// get the count from the org
query = new Parse.Query('Organization')
query.equalTo("objectId", orgId)
query.first({ useMasterKey: true }).then(function(object) {
console.log('in query')
// assign it as a variable.
var ticketNumber = object.get('ticketNumber')
console.log(ticketNumber)
// atomic increment ticket number on org
object.increment("ticketNumber")
object.save(null, { useMasterKey: true });
// save the ticketNumber to the comment
request.object.set("ticketNumber", ticketNumber)
response.success();
}, function(error) {
response.error("something happened")
});
});
当然,如果有一个对象进入,它就可以工作..就在从客户端保存多个对象时...
答案 0 :(得分:1)
保存和查询Org
将异步发生,并且所有保存将同时发生,获取相同的组织,并在任何保存之前分配旧值。
而不是来自iOS客户端的saveAll,创建一个云代码函数,该函数需要保存一系列注释。如果它们都属于同一个Org,您可以从第一个注释中获取一次,然后遍历您的注释,递增组织的ticketNumber并依次将其分配给每个对象,然后将所有内容(注释和组织)保存在一起。 / p>
如果注释并不总是相同的org,您可以首先遍历您的注释以获取所需的所有组织,将它们放在数组中并执行fetchAll,然后迭代您的注释并适当地访问组织。这是一个好主意,因此如果您有20张票,则每次取出两个对象而不是两个对象10次,每个对应2个不同的组织。
如果您仍需要访问故障单,可以单独保存组织和故障单,并在评论中返回saveAll的保存结果。
编辑:
在云代码中,您可以拥有类似的内容,假设所有评论都具有相同的组织:
Parse.Cloud.define("saveComments", function(request, response) {
var comments = request.params.comments;
if( !comments || comments.length == 0 ) return response.success(); //Handle case with no comments to save - Job done!
var org = comments[0].get("org");
// Since you don't need to include any Parse Objects, you can use fetch instead of query
org.fetch({useMasterKey:true}).then(
function(organization) {
for( comment in comments ) {
organization.increment("ticketNumber");
comment.set("ticketNumber", organization.get("ticketNumber"));
}
return organization.save(null, {useMasterKey:true}).then(
function(organization) {
return Parse.Object.saveAll(comments, {useMasterKey:true}); //Put this after saving the org, so the return value is the same as your current client save all call
}
);
}
).then(
function(success) { response.success(success); },
function(error) { response.error(error); }
);
});
然后在您的iOS客户端上,您可以执行以下操作,而不是使用saveAll:
NSDictionary *params = @{"comments":commentsArray};
[PFCloud callFunctionInBackground:@"saveComments" withParams:params...];`