2014-11-21 2 views
0

Есть ли способ использовать путь, возвращенный с "PHImageFileURLKey", чтобы войти в библиотеку фотографий и получить изображение?PhotoKit iOS8 - Извлечь изображение с помощью «PHImageFileURLKey»

Путь возвращается в таком формате:

"file:///var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG" 

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

Любая помощь приветствуется. Спасибо!

ответ

8

Я думаю, что ваше решение по извлечению ресурса Photo Kit из URL-адреса неверно.

Вот что я хотел бы сделать (предположим, у вас есть доступ к PHAsset):

следует хранить localIdentifier:

PHAsset *asset = /*Your asset */ 
NSString *localIdentifier = asset.localIdentifier; 

//Now save this local identifier, or an array of them 

Когда пришло время, чтобы получить их, вы просто сделать:

PHFetchResult *savedAssets = [PHAsset fetchAssetsWithLocalIdentifiers:savedLocalIdentifiers options:nil]; 
[savedAssets enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) { 
    //this gets called for every asset from its localIdentifier you saved 
}]; 

Если у вас есть доступ к «PHImageFileURLKey», не обращайте на него внимания.

2

Это не задокументировано, поэтому я категорически запретил использовать этот URL-адрес для чего-то большего, чем прототип приложения. Тем не менее, это, по всей видимости работы:

dispatch_queue_t queue = dispatch_queue_create("photoLoadQueue", 0); 
dispatch_async(queue, ^{ 
    NSURL *privateUrl = [NSURL URLWithString:@"file:///var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG"; 
    NSData *imageData = [NSData dataWithContentsOfURL:privateUrl]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.imageView.image = [UIImage imageWithData:imageData]; 
    }); 
}); 

Естественно вам нужно заменить строку, используемую для инициирования URL с той, которая действует для вашего телефона.

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

  1. При работе на тренажере, корневой путь регулярно меняется между запусками приложения, так что если вы храните absoluteUrls как это ваша база данных будет быстро наполнится мертвых URL. Это будет неудобно, если не сказать больше.
  2. Хуже того, URL-адреса изображений могут изменяться на реальном устройстве - вы не контролируете его, и как только они меняются, это ошибка вашего приложения, чтобы заставить пользователя повторно выбрать их или что-то еще.
  3. Вы никогда не узнаете об изменениях в PHAsset, с которых была сделана фотография.
  4. Это может быть обход разрешения пользователя на доступ к фотографии - что произойдет, если разрешение вашего приложения на доступ к фотографиям отменено? Это, вероятно, проблема с множеством подходов к хранению фотографий для последующего использования.
  5. Вы не контролируете файл - что, если пользователь его удалит?

Если бы я тебя, я бы получить изображение правильно с фото рамки, используя PHImageManager requestImageForAsset: targetSize: contentMode: options: resultHandler:, и сохранить его в файл в каталоге вашего приложения, в разумном разрешении на то, что вы делаете с ним. Это все еще не дает вам изменений в активах, но является довольно хорошим решением.

Если вы хотите сами хранить свои ресурсы и запрашивать изображения только тогда, когда они вам действительно нужны, возможно, стоит изучить transient asset collections, хотя я не использовал их, чтобы они не работали для того, что вам нужно.

+1

Благодарим вас за подробный ответ. Прочитав потенциальные проблемы, которые вы изложили, я решил отказаться от этого подхода. Вместо этого я использую свойство LocalIdentifier в объекте PHObject, чтобы однозначно идентифицировать изображение и извлечь его из библиотеки. Я смог использовать метод fetchAssetsWithLocalIdentifiers: чтобы вернуть их. – pnavk

+1

Спасибо, я этого не видел, и это позволило мне улучшить мое приложение! Я так люблю. –

+0

Ваш код приводит к ошибке «Операция не разрешена». – Mojo66

Смежные вопросы