Parse.com:通过httprequest将一系列词典传递给backgroundJob

问题描述 投票:1回答:1

我有一个包含地址簿所有联系人的数组。当我在客户端和云端代码中保存所有内容时,我的请求总是超时,导致部分保存联系人列表。这就是我想使用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")
        }
    });
});
ios objective-c cloud parse-platform
1个回答
2
投票

您是否尝试将数组作为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
        }
    }];
}
© www.soinside.com 2019 - 2024. All rights reserved.