我以为我已经想通了,但我不能得到它的工作。 我有一个名为在阵列中的每个URL方法。 这种方法具有应在特定的路径供脱机使用一个应用程序支持文件夹下载的图片的URL。 但是,也许我误解的AFNetwork库的方法。 我的方法是这样的:
- (void) downloadImageInBackground:(NSDictionary *)args{
@autoreleasepool {
NSString *photourl = [args objectForKey:@"photoUrl"];
NSString *articleID = [args objectForKey:@"articleID"];
NSString *guideName = [args objectForKey:@"guideName"];
NSNumber *totalNumberOfImages = [args objectForKey:@"totalNumberOfImages"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:photourl]];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.inputStream = [NSInputStream inputStreamWithURL:[NSURL URLWithString:photourl]];
[operation setShouldExecuteAsBackgroundTaskWithExpirationHandler:^{
DLog(@"PROBLEMS_AF");
}];
DLog(@"URL_PHOTOURL: %@", photourl);
DLog(@"indexSet: %@", operation.hasAcceptableStatusCode);
[operation response];
NSData *data = [args objectForKey:@"data"];
NSString *path;
path = [NSMutableString stringWithFormat:@"%@/Library/Application Support/Guides", NSHomeDirectory()];
path = [path stringByAppendingPathComponent:guideName];
NSString *guidePath = path;
path = [path stringByAppendingPathComponent:photourl];
if ([[NSFileManager defaultManager] fileExistsAtPath:guidePath]){
[[NSFileManager defaultManager] createFileAtPath:path
contents:data
attributes:nil];
}
DLog(@"path: %@", path);
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation start];
DLog(@"isExecuting: %d",[operation isExecuting]);
DLog(@"IS_FINISHED: %d",[operation isFinished]);
}
}
PhotoURL是直接链接到我要下载的图像。
由于这种方法被称为对所有图像,所有的日志被称为几次,似乎是正确的。
这里有几个问题。 所以首先,你为什么要使用@autoreleasepool
? 我认为没有必要为这个在这里。 同时,您使用的ARC? 我认为这一点,我的回答的其余部分。
在AFNetworking有一类叫做AFImageRequestOperation
,所以这将是你使用一个好主意。 第一,导入
#import "AFImageRequestOperation.h"
那么你可以创建一个对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:photourl]];
AFImageRequestOperation *operation;
operation = [AFImageRequestOperation imageRequestOperationWithRequest:request
imageProcessingBlock:nil
cacheName:nil
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"%@", [error localizedDescription]);
}];
现在,在成功的块,你得到了你所需要的UIImage的。 有你需要得到的文件目录。 您的代码将不会在iOS设备上运行。
// Get dir
NSString *documentsDirectory = nil;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
documentsDirectory = [paths objectAtIndex:0];
NSString *pathString = [NSString stringWithFormat:@"%@/%@",documentsDirectory, guideName];
然后你可以使用NSDatas writeToFile
// Save Image
NSData *imageData = UIImageJPEGRepresentation(image, 90);
[imageData writeToFile:pathString atomically:YES];
最后,你需要开始操作
[operation start];
全部一起:
- (void)downloadImageInBackground:(NSDictionary *)args{
NSString *guideName = [args objectForKey:@"guideName"];
NSString *photourl = [args objectForKey:@"photoUrl"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:photourl]];
AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request
imageProcessingBlock:nil
cacheName:nil
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
// Get dir
NSString *documentsDirectory = nil;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
documentsDirectory = [paths objectAtIndex:0];
NSString *pathString = [NSString stringWithFormat:@"%@/%@",documentsDirectory, guideName];
// Save Image
NSData *imageData = UIImageJPEGRepresentation(image, 90);
[imageData writeToFile:pathString atomically:YES];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"%@", [error localizedDescription]);
}];
[operation start];
}
这里的问题是,该操作不保留。 它会立即释放。
要么使操作类的属性或让操作队列(也是属性)为您处理请求(推荐)。 在后一种情况下,不叫[operation start]
。 当您使用AFHTTPClient
操作队列也将为您进行管理。
你也应该注册请求操作完成回调( setCompletionBlockWithSuccess:failure:
)。