2015-02-22 4 views
6

Выбор изображений в Photos.app для перехода к расширению действия, кажется, дает пути к изображениям на диске (например: file:///var/mobile/Media/DCIM/109APPLE/IMG_9417.JPG). Есть ли способ получить соответствующий ALAsset или PHAsset?Извлечь ALASset или PHAsset из файла URL

URL-адрес выглядит так, как будто это соответствует записи PHImageFileURLKey, полученной от звонка PHImageManager.requestImageDataForAsset. Мне бы очень хотелось, чтобы я перебирал все PHAssets, чтобы найти его.

+0

Это NSURL. Вы не видите, как добраться отсюда до PHAsset? – matt

+0

Я этого не делаю. Там 'fetchAssetsWithALAssetURLs', но это только принимает URL-адреса' assets-library: // '. – Duc

+0

Хмм, это даже хуже. Вы даже не можете попасть в библиотеку из-за песочницы. – matt

ответ

4

Я сделал то, что я не хотел делать, и бросил этот тупой подход поиска. Он работает, хотя он ужасный, медленный и дает мне проблемы с памятью, когда библиотека фотографий большая.

Как ни к какао, так и к Swift я бы ценю советы по изысканности. Благодаря!

func PHAssetForFileURL(url: NSURL) -> PHAsset? { 
    var imageRequestOptions = PHImageRequestOptions() 
    imageRequestOptions.version = .Current 
    imageRequestOptions.deliveryMode = .FastFormat 
    imageRequestOptions.resizeMode = .Fast 
    imageRequestOptions.synchronous = true 

    let fetchResult = PHAsset.fetchAssetsWithOptions(nil) 
    for var index = 0; index < fetchResult.count; index++ { 
     if let asset = fetchResult[index] as? PHAsset { 
      var found = false 
      PHImageManager.defaultManager().requestImageDataForAsset(asset, 
       options: imageRequestOptions) { (_, _, _, info) in 
        if let urlkey = info["PHImageFileURLKey"] as? NSURL { 
         if urlkey.absoluteString! == url.absoluteString! { 
          found = true 
         } 
        } 
      } 
      if (found) { 
       return asset 
      } 
     } 
    } 

    return nil 
} 
1

Так что это комментарий к («советы уточнения») к вашему автоответу. Комментарии SO не вырезают его для образцов кода, поэтому мы идем.

  1. Вы можете заменить петлю for-index более простым для каждого цикла. Например. что-то вроде:

    for asset in PHAsset.fetchAssetsWithOptions(nil) 
    
  2. В последний раз, когда я проверял, ключ в info["PHImageFileURLKey"] недокументирован. Будьте внимательны. Я не думаю, что это отклонит вас, но поведение может измениться в любое время.

+0

Спасибо за примечания. Я определенно предпочитаю for .. in синтаксис, но PHFetchResult не реализует протокол Generator и не может быть повторен таким образом (если только что-то не изменилось в последнее время). – Duc

+0

Я не мог заставить его работать. И [этот ответ] (http://stackoverflow.com/a/25872991/170871) указывает, что вам понадобится SequenceType (не генератор, получается), чтобы сделать совместимым с NSFastEnumeration типы. – Duc

+0

Отредактированный комментарий, не в порядке: @Soybean Я могу говорить только с Objective-C прямо сейчас, но там будет 'NSFastEnumeration', и да, это так:' @interface PHFetchResult: NSObject ':) –

0

Вопрос: Почему вы хотите это сделать? Вы хотите вызвать/использовать любые методы из PhotoKit? Я бы предпочел работать непосредственно с файлом, который передает Photos-App.

+0

Да, мое приложение удаляет фотографии, поэтому мне нужен PHAsset. На самом деле, как и недокументированный ключ, который Clay [упоминает] (http://stackoverflow.com/a/28887364/170871), я беспокоюсь, что Apple не будет увлекаться удалением активов в расширении. Но посмотрим, что получится! – Duc

+0

@ Соя В любом случае спросит «ты уверен», так что твоя способность к «вреду» значительно сокращается. –

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