在我的应用程序中有一系列包含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)
{
...
}
}
非常感谢!
答案 0 :(得分:1)
您应该使用NSOperationQueue
来管理服务器呼叫,将setMaxConcurrentOperationCount
用于1,例如:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:1];
您还可以查看此Link了解更多详情。
答案 1 :(得分:0)
您可以将对象管理器http客户端的操作队列设置为最大并发计数为1.您可以使用RestKit进行映射,然后使用其他内容进行上载。
可以说你应该修改服务器,以便发送对象和相关的订购信息,然后收到它们的顺序并不重要(这将消除将来可能出现的许多麻烦)。