Хранение и извлечение изображений из каталога документов в tableView?

Я пытаюсь сохранить изображения из веб-сервиса в каталоге документов. Для сохраненного изображения я хочу загрузить его из каталога документов в виде таблицы. Изображения доступны по URL-адресу, например: - http://Address/App/User/Image/Puegeot_E7

Извлечение из веб-службы прошло успешно, однако из каталога документов я продолжаю получать нулевое изображение. Кажется, я не могу найти, что здесь не так.

- (void)saveImage:(UIImage*)image withName:(NSString *)imageName
{
    if (image != nil)
    {
        NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString* path = [documentsDirectory stringByAppendingPathComponent:imageName];

        NSLog(@"Saving path %@",path); // Saving path /Users/computername/Library/Developer/CoreSimulator/Devices/7277F3D3-298C-451A-8607-8070A08650C7/data/Containers/Data/Application/D3AF4DD9-A4CD-42C8-A8EB-0F15C271EE61/Documents/CabImage/Puegeot_E7

        NSData* data = UIImagePNGRepresentation(image);
        [data writeToFile:path atomically:YES];
    }
}

- (UIImage *)getImageFromURL:(NSString *)fileURL
{
   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
   NSString *documentsDirectory = [paths objectAtIndex:0];
   NSString *path = [documentsDirectory stringByAppendingPathComponent:fileURL];
   NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path]];
   NSLog(@"data %@",data); //This returns (null)
   UIImage *result = [UIImage imageWithData:data];
   return result;
}

В tableView так я пытаюсь загрузить из каталога документов.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   //default initialisation stuff
   NSDictionary *obj = [responseArray objectAtIndex:indexPath.row];
   cell.imgVW.image = [UIImage imageNamed:@"default-car.png"];
   NSString *imgPath = obj[@"cabimage"];
   NSLog(@"imgPath : %@",imgPath); // imgPath : Image/Puegeot_E7 
   UIImage *imgFromDisk = [self getImageFromURL:imgPath];
   NSLog(@"imgFromDisk - %@",imgFromDisk); -> (null)
   if (imgFromDisk) 
   {
       cell.imgVW.image = imgFromDisk;
   }
   else
   {
       //download
       NSURL *imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@User/%@",BASE_URL,imgPath]];

       self.task = [self.session downloadTaskWithURL:imageURL 
                   completionHandler:^(NSURL *location,NSURLResponse *response,NSError *error)
       {
            NSData *img_data = [NSData dataWithContentsOfURL:imageURL];
            if (img_data) 
            {
                 UIImage *img = [UIImage imageWithData:img_data];
                 dispatch_async(dispatch_get_main_queue(), ^{
                    ListCell *cell = (id)[tableView cellForRowAtIndexPath:indexPath];
                    cell.imgVW.image = img;                                 
                    [self saveImage:img withName:imgPath];

                });
            }
       }];
       [self.task resume];
   }
}

person icodes    schedule 22.06.2016    source источник


Ответы (3)


Для начала я рекомендую вам использовать библиотеку SDWebImage — асинхронный загрузчик изображений с поддержкой кеша. Использование достаточно простое:

[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                      placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                             completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                                ... completion code here ...
                             }];

Однако, если вы хотите сделать это по-своему. Вы должны изменить ss 2 строки кода:

UIImage *imgFromDisk = [self getImageFromURL:imgPath];

в это:

UIImage *imgFromDisk = [self getImageFromURL:[imgPath lastPathComponent]];

и

[self saveImage:img withName:imgPath];

в это:

[self saveImage:img withName:[imgPath lastPathComponent]];
person The Mach System    schedule 23.06.2016
comment
Спасибо .. работает отлично. SDWebImage выглядит хорошо, я просто хотел попробовать его без использования библиотеки. - person icodes; 23.06.2016
comment
Не волнуйтесь. Рад, что это помогает - person The Mach System; 23.06.2016

Проблема кажется очевидной из того, что вы видите в журналах:

NSLog(@"imgPath : %@",imgPath); // imgPath : Image/Puegeot_E7

Этот путь не находится в каталоге документов.

Чтобы получить более надежный контроль над этим, пусть метод сохранения возвращает путь к тому месту, где было сохранено изображение:

- (NSString *)saveImage:(UIImage*)image withName:(NSString *)imageName{
    // op code, then:
    return path;
}

Проверьте, можете ли вы прочитать изображение. (Этот код для теста, а не для приложения).

UIImage *testImage = [UIImage imageNamed:@"some_test_image"];
NSString *path = [self saveImage:testImage withName:@"test_name"];
UIImage *didItWork = [self getImageFromURL:path];
NSLog(@"did it work? %@", didItWork);

Вернемся к реальному приложению... После того, как путь вернулся из записи изображения в вашу модель:

UIImage *downloadedImage = // however you get this
NSString * downloadedImageName = // however you get this
NSDictionary *obj = [responseArray objectAtIndex:indexPath.row];
obj[@"cabbage"] = [self saveImage: downloadedImage withName:downloadedImageName];

Теперь мы знаем, что ваш метод cellForRowAtIndexPath увидит сохраненный путь, и из теста мы знаем, что создание образа по этому пути будет работать.

person danh    schedule 22.06.2016

Вы получаете nil, потому что не указали правильный путь для получения изображения. Вы просто используете имя изображения, но вы должны использовать тот же путь, по которому вы его сохранили.

Итак, поставьте:

NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent:imageName];

В вашем методе getImageFromURL.

Не используйте просто имя изображения для получения изображения. Надеюсь это поможет!

(извиняюсь за плохое оформление текста, пишу с телефона)

person FilipD    schedule 22.06.2016
comment
Согласно предложению, я обновил код. Однако все еще сталкиваюсь с той же проблемой. - person icodes; 22.06.2016