我刚刚开始使用AFNetworking,到目前为止它只能从网上获取数据。
但现在我有一个需要下载到设备的文件列表
for(NSDictionary *issueDic in data)
{
Issue *issue = [[Issue alloc] init];
...
[self getOrDownloadCover:issue];
...
}
getOrDownloadCover:问题检查文件是否已在本地存在,如果存在,则只保存该路径,如果不存在,则从给定的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:问题可以连续调用20次,所以我需要将所有请求放入队列中,一旦队列完成,它仍然可以保存路径(或者只发出一个通知,因为我已经知道路径是什么了)
对此有何建议?
答案 0 :(得分: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
});
答案 1 :(得分:0)
不确定这是否有用但是......
您可以使用AFHTTPClient的operationQueue,而不是使用自己的operationQueue。使用enqueueHTTPOperation将单个操作排入队列,或者使用enqueueBatchOperations将一系列操作排入队列(我从内存中回忆起这些方法名称,可能稍微偏离)。
至于存储特定于每个操作的数据,您可以为AFHTTPRequestOperation创建子类,并为您要存储的路径设置属性。像这样的东西。