下载大量文件时,Restkit RKObjectManager请求超时

时间:2013-08-22 16:00:32

标签: ios objective-c restkit restkit-0.20

首先:我对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];
}

似乎它立即启动所有下载,但是不启动执行下载。所以上次下载会超时。

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

将队列上的最大并发操作数设置为某个合理的值,如5。

[objectManager.HTTPClient.operationQueue setMaxConcurrentOperationCount:5];

(在您开始任何请求之前)

答案 1 :(得分:1)

所有下载同时运行,因为您正在连续进行所有getPath:次调用(它们是异步调用)。由于每次下载都需要一段时间才能完成,因此会导致后续调用超时。

如果您希望每次下载仅在前一次下载完成后进行,我将创建一个名为getNextAudioFile:的方法和一个迭代器类属性。然后,在success的{​​{1}}和failure块中,递增迭代器并调用getPath:

示例代码:

getNextAudioFile:

这至少就是这个想法!希望它有所帮助。