首先:我对RestKit很陌生,所以这可能是一个容易解决的问题。
我正在尝试下载大量文件。目前,我使用getObjectsAtPath:parameters:success:failure:
的{{1}}方法来获取并将我的对象映射到restkit。
然而,似乎它过早地开始一些下载,然后当它们在队列中时超时。
我正在使用的代码:
RKObjectManager
- (void)removeResponseAndRequestDescriptors
{
RKObjectManager *objectManager = [RKObjectManager sharedManager];
[objectManager.requestDescriptors enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[objectManager removeRequestDescriptor:obj];
}];
[objectManager.responseDescriptors enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[objectManager removeResponseDescriptor:obj];
}];
}
- (void)downloadAudioFileForAudio:(IBAudio *)audio
inBook:(IBBook *)book
downloadStatus:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))downloadStatus
success:(void (^)(void))success
failure:(void (^)(NSError *error))failure
{
RKObjectManager *objectManager = [RKObjectManager sharedManager];
NSString *sessionID = (book.parent ? book.parent.user.session.sessionID : book.user.session.sessionID);
[objectManager.HTTPClient setDefaultHeader:@"Accept" value:@"application/octet-stream"];
[objectManager.HTTPClient setDefaultHeader:@"Session-Id" value:sessionID];
[objectManager.HTTPClient getPath:[IBProperties downloadAudioEndPointWithIsbn:book.isbn andAnchor:audio.anchor] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *folderPath = [self folderPathForBook:book];
NSString *audioPath = [folderPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.mp3", audio.anchor]];
NSData *audioData = [NSData dataWithData:responseObject];
NSError *fileSystemSaveError;
[self saveFile:audioData toFilePath:audioPath error:&fileSystemSaveError];
if (fileSystemSaveError) {
failure(fileSystemSaveError);
return;
}
// Saving the context asap in case the app dies before it can autosave.
NSError *coreDataSaveerror;
[[[[RKObjectManager sharedManager] managedObjectStore] mainQueueManagedObjectContext] save:&coreDataSaveerror];
if (coreDataSaveerror) {
failure(coreDataSaveerror);
return;
}
[audio setFilePath:audioPath];
success();
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
failure(error);
}];
[objectManager.HTTPClient.operationQueue.operations.lastObject setDownloadProgressBlock:downloadStatus];
}
似乎它立即启动所有下载,但是不启动执行下载。所以上次下载会超时。
有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
将队列上的最大并发操作数设置为某个合理的值,如5。
[objectManager.HTTPClient.operationQueue setMaxConcurrentOperationCount:5];
(在您开始任何请求之前)
答案 1 :(得分:1)
所有下载将同时运行,因为您正在连续进行所有getPath:
次调用(它们是异步调用)。由于每次下载都需要一段时间才能完成,因此会导致后续调用超时。
如果您希望每次下载仅在前一次下载完成后进行,我将创建一个名为getNextAudioFile:
的方法和一个迭代器类属性。然后,在success
的{{1}}和failure
块中,递增迭代器并调用getPath:
。
示例代码:
getNextAudioFile:
这至少就是这个想法!希望它有所帮助。