我有一个包含地址簿所有联系人的数组。当我在客户端和云端代码中保存所有内容时,我的请求总是超时,导致部分保存联系人列表。这就是我想使用cloudcode backgroundjob
的原因。
我找不到将数组传递给后台作业的方法。我怎样才能做到这一点?
iOs客户端调用http请求并传递allItems
[PFCloud callFunctionInBackground:@"httpRequest" withParameters:@{@"myArray" :allItems} block:^(NSString *result, NSError *error) {
if (!error) {
NSLog(@"Result is: %@", result);
}
}];
我的httpRequest
Parse.Cloud.define('httpRequest', function(request, response) {
var body = request.params.myArray;
Parse.Cloud.httpRequest({
method: "POST",
url: "https://api.parse.com/1/jobs/userMigration",
headers: {
"X-Parse-Application-Id": "...",
"X-Parse-Master-Key": "...",
"Content-Type": "application/json"
},
body:
"body" : body;
,
success: function(httpResponse) {
console.log(httpResponse);
},
error: function(error) {
console.log("ERROR");
}
});
});
我的后台工作职能。 (当用作基本云代码功能时,此功能正常工作)
Parse.Cloud.job("userMigration", function(request, status) {
// Set up to modify user data
var array = request.params.myArray;
var arr = new Array();
var user = request.user;
array.forEach(function(entry) {
var Contact = Parse.Object.extend("Contacts");
var contact = new Contact();
contact.set("name", entry.name);
contact.set("email", entry.email);
contact.set("phone", entry.phone);
contact.set("phoneFormated", entry.phoneFormated);
contact.set("userId", user);
arr.push(contact);
});
Parse.Object.saveAll(arr, {
success: function(objs) {
// objects have been saved...
reponse.success("object saved")
},
error: function(error) {
// an error occurred...
response.error("mistake")
}
});
});
您是否尝试将数组作为JSON传递?喜欢 :
...
body: JSON.stringify(body),
...
在后台工作:
var array = JSON.parse(request.body);
另请注意,您的云功能将等待后台作业的响应,因此您的云功能仍可能超时(但我不确定后台作业是否会被终止)。
如果您在parse.com上有免费计划,请不要忘记您只能同时运行一个后台作业。这就是为什么从iOS应用程序调用后台作业不是一个好的解决方案。也许您应该尝试直接从parse.com安排后台作业或调用多个云功能/保存。
我认为最好的解决方案是这样的:
NSUInteger arraySize = 10;
__block NSUInteger callCount = array.length / arraySize; // the number of call to saveAll you will make
for (NSUInteger i = 0 ; i < array.length / arraySize ; ++i) {
NSArray * tmpArray = [allItems subarrayWithRange:NSMakeRange(i * arraySize, arraySize)];
[PFObject saveAllInBackground:tmpArray block:^(BOOL succeeded, NSError *error) {
callCount--;
if (succeeded) {
if (callCount < 0) {
NSLog(@"last item has been saved");
}
} else {
// handle error
}
}];
}