0

我刚开始使用 AFNetworking,到目前为止,它对于从网络获取数据来说效果很好。

但是现在我有一个需要下载到设备的文件列表

for(NSDictionary *issueDic in data)
{
    Issue *issue = [[Issue alloc] init];
    ...
    [self getOrDownloadCover:issue];
    ...
}

getOrDownloadCover:issue 检查文件是否已在本地存在,如果存在,则仅保存该路径,如果不存在,则从给定 url 下载文件

- (void)getOrDownloadCover:(Issue *)issue
{
    NSLog(@"issue.thumb: %@", issue.thumb);

    NSString *coverName = [issue.thumb lastPathComponent];

    NSLog(@"coverName: %@", coverName);

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    __block NSString *filePath = [documentsDirectory stringByAppendingPathComponent:coverName];

    if([[NSFileManager defaultManager] fileExistsAtPath:filePath])
    {
        // Cover already exists
        issue.thumb_location = filePath;

        NSLog(@"issue.thumb_location: %@", filePath);
    }
    else 
    {
        NSLog(@"load thumb");

        // Download the cover
        NSURL *url = [NSURL URLWithString:issue.thumb];
        AFHTTPClient *httpClient = [[[AFHTTPClient alloc] initWithBaseURL:url] autorelease];
        NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:issue.thumb parameters:nil];

        AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];
        operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];

        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        issue.thumb_location = filePath;

        NSLog(@"issue.thumb_location: %@", filePath);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"FAILED");
    }];
        [operation start];
    }
}

getOrDownloadCover:issue 可以连续调用 20 次,所以我需要将所有请求放入队列中,一旦队列完成,它应该仍然能够保存路径(或者只是发送通知,因为我已经知道路径是什么)

对此有什么建议吗?

4

2 回答 2

2

添加一个NSOperationQueue对象,您可以在应用程序中的任何位置获取其实例,例如在您的 appDelegate 中。然后只需将其添加AFHTTPRequestOperation到此队列中,例如:

[[(AppDelegate *) [UIApplication sharedApplication].delegate operartionQueue] addOperation:operation];

只需处理完成块中的保存,或者从主线程上的该块调用方法或发布NSNotification.

要调用主线程,请使用 GCD :

dispatch_async(dispatch_get_main_queue(), ^{
    // Call any method from on the instance that created the operation here.
    [self updateGUI]; // example
});
于 2012-07-26T09:19:24.907 回答
0

不确定这是否有帮助,但......

您可以使用 AFHTTPClient 的 operationQueue,而不是使用您自己的 operationQueue。使用 enqueueHTTPOperation 将单个操作排入队列或使用 enqueueBatchOperations 将一组操作排入队列(我正在从内存中回忆起这些方法名称,可能有点偏离)。

至于存储特定于每个操作的数据,您可以继承 AFHTTPRequestOperation 并为您想要存储的路径设置属性。像这样的东西。

于 2013-01-31T16:40:11.330 回答