RestKit:同步发布多个对象

时间:2014-04-07 18:32:49

标签: ios post upload restkit synchronous

在我的应用程序中有一系列包含GPS日志的词典(每个词典100个)。我必须一次一个地将这些词典发布到服务器上。我遇到的问题不是发布哪个与RestKit一起工作很好,而是我必须以与它们在数组中相同的顺序发布它们。这是由于字典中的索引计数不应该在服务器上乱搞,并且与数组中的顺序相同。

如何以同步方式使用RestKit发布这些对象?

这是我目前正在使用的代码(异步):

for (int i = 0; i < [arrayOfGPSLogChunks count]; i++)
{
    NSMutableDictionary *historyToUpload = [[NSMutableDictionary alloc] init];
    [historyToUpload setObject:driveID forKey:@"driveID"];
    [historyToUpload setObject:[arrayOfGPSLogChunks objectAtIndex:i] forKey:@"gpsLog"];

    [[RKObjectManager sharedManager] postObject:nil
                                           path:@"api/drives/addDriveChunk"
                                     parameters:historyToUpload
                                        success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
     {
         RKLogInfo(@"Successfully Uploaded Drive Chunk %i/%i", i,arrayOfGPSLogChunks.count);
     }
                                        failure:^(RKObjectRequestOperation *operation, NSError *error)
     {
         RKLogError(@"Failed Uploading Drive Chunk (%i): (Error: %@)", i, error);
     }];
}

更新

我尝试使用这种方法,它只是按照我想要的方式工作,但它会阻止我的整个UI线程:

for (int i = 0; i < [arrayOfGPSLogChunks count]; i++)
{
    NSMutableDictionary *historyToUpload = [[NSMutableDictionary alloc] init];
    [historyToUpload setObject:driveID forKey:@"driveID"];
    [historyToUpload setObject:[arrayOfGPSLogChunks objectAtIndex:i] forKey:@"gpsLog"];

    NSData *requestData = [NSJSONSerialization dataWithJSONObject:historyToUpload options:NSJSONWritingPrettyPrinted error:nil];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:kUploadDrivesChunkURL]
                                                              cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:kConnectionTimeOut];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody: requestData];

    RKObjectRequestOperation *operation = [[RKObjectManager sharedManager] objectRequestOperationWithRequest:request success:nil failure:nil];
    [operation start];
    [operation waitUntilFinished];

    if (operation.error)
    {
         ...
    }

}

非常感谢!

2 个答案:

答案 0 :(得分:1)

您应该使用NSOperationQueue来管理服务器呼叫,将setMaxConcurrentOperationCount用于1,例如:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:1];

您还可以查看此Link了解更多详情。

答案 1 :(得分:0)

您可以将对象管理器http客户端的操作队列设置为最大并发计数为1.您可以使用RestKit进行映射,然后使用其他内容进行上载。

可以说你应该修改服务器,以便发送对象和相关的订购信息,然后收到它们的顺序并不重要(这将消除将来可能出现的许多麻烦)。