Получить ALAsset или PHAsset из URL-адреса файла

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

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


person Duc    schedule 22.02.2015    source источник
comment
Это NSURL. Вы не видите, как оттуда добраться до PHAsset?   -  person matt    schedule 22.02.2015
comment
Я не. Есть fetchAssetsWithALAssetURLs, но он принимает только assets-library:// URL-адресов.   -  person Duc    schedule 22.02.2015
comment
Хм, это еще хуже. Вы даже не можете попасть в библиотеку из-за песочницы.   -  person matt    schedule 22.02.2015
comment
А как насчет ALAssetsLibrary assetForURL?   -  person matt    schedule 22.02.2015
comment
Также требуется схема активов-библиотеки (не то, чтобы это меня остановило: я пробовал и assetForURL, и fetchAssetsWithALAssetURLs для удовольствия; без костей).   -  person Duc    schedule 22.02.2015
comment
Я могу быть сумасшедшим, но кажется, что никоим образом все эти расширения фотографий в iOS 8 получают URL-адреса файлов и делают то, что они делают. Вы задали этот вопрос?   -  person Clay Bridges    schedule 07.03.2015
comment
Верно. Расширение для редактирования фотографий на самом деле дает вам PHAsset (или что-то еще из PhotoKit). Однако я хочу играть с несколькими фотографиями одновременно (т. е. нажать кнопку «Выбрать» и коснуться нескольких фотографий), и для этого вам нужно расширение общего доступа или действия. Для тех, кого я понимаю, почему файл полезен: вы, вероятно, загружаете их куда-то или выполняете некоторую обработку фактических данных.   -  person Duc    schedule 07.03.2015


Ответы (2)


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

Как новичок в Cocoa и 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
}
person Duc    schedule 23.02.2015

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

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

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

person Clay Bridges    schedule 05.03.2015
comment
Спасибо за заметки. Я определенно предпочитаю for .. в синтаксисе, но PHFetchResult не реализует протокол генератора и не может повторяться таким образом (если что-то не изменилось недавно). - person Duc; 07.03.2015
comment
Я не мог заставить его работать. И этот ответ указывает, что вам нужен SequenceType (а не генератор, оказывается), чтобы сделать даже типы, совместимые с NSFastEnumeration, итерируемыми. - person Duc; 07.03.2015
comment
Отредактированный комментарий, не по порядку: @Soybean Прямо сейчас я могу говорить только с Objective-C, но там это будет NSFastEnumeration, и да, это так: @interface PHFetchResult : NSObject <NSCopying, NSFastEnumeration> :) - person Clay Bridges; 07.03.2015