Странное поведение с PHImageManager при запросе данных изображения для PHAsset - PullRequest
0 голосов
/ 22 апреля 2020

Я создаю базовый c редактор изображений, который берет изображение и применяет базовые c изменения метаданных. После внесения любых изменений я использую PHAssetChangeRequest для отправки изменений в библиотеку фотографий.

Насколько я понимаю, при этом я не изменяю исходный носитель, а создаю новый PHAssetResource.

Я могу подтвердить, что мои правки работают и новые PHAssetResources добавляются в PHAsset. Журналы см. Ниже.

Почему при запросе данных изображения для этого актива (после изменения) мне предоставляется исходный актив даже при запросе с options.version = .current.

Закрытие приложение и его перезапуск, кажется, исправляют это поведение, и та же самая функция возвращает правильные, измененные данные изображения с этого момента. Таким образом, приложение полностью перезагружает все ресурсы из библиотеки фотографий. Но это не должно влиять на запрос фактических данных изображения из активов.

Есть ли способ принудительно установить свойство isCurrent ресурсов ресурса или есть что-то, чего я пропускаю?

 ///Loads the photos data using a completion handler
    func getPhotoData(photo: Photo, reflectingEdits: Bool = true, completionHandler: @escaping (Data?) -> ()){

        let options = PHImageRequestOptions()
        options.isNetworkAccessAllowed = true
        options.version = .original

        if(reflectingEdits){
            options.version = .current
        }

        manager.requestImageDataAndOrientation(for: photo.asset, options: options, resultHandler: {
            data, uti, orientation, info in

            print("Succesfully delivered image (\(String(describing: uti))) -> \(data?.count ?? 0) bytes")

            completionHandler(data)
        })
    }

До

[<PHAssetResource: 0x28328eb50> {
    type: video_cmpl
    uti: com.apple.quicktime-movie
    filename: IMG_0067.MOV
    asset: 8B5B03FE-9862-4DD9-BB81-C9753FDE328B/L0/001
    locallyAvailable: YES
    fileURL: file:///var/mobile/Media/PhotoData/CPLAssets/group125/5571C124-DF27-4636-9AFC-23786A33850B.MOV
    width: 980
    height: 1308
    fileSize: 2403227
    analysisType: unavailable
    cplResourceType: OriginalVidCompl
    isCurrent: YES
}, <PHAssetResource: 0x283281dd0> {
    type: photo
    uti: public.heic
    filename: IMG_0067.HEIC
    asset: 8B5B03FE-9862-4DD9-BB81-C9753FDE328B/L0/001
    locallyAvailable: YES
    fileURL: file:///var/mobile/Media/PhotoData/CPLAssets/group125/5571C124-DF27-4636-9AFC-23786A33850B.HEIC
    width: 3024
    height: 4032
    fileSize: 1331238
    analysisType: never-download
    cplResourceType: Original
    isCurrent: YES
}]

После


[<PHAssetResource: 0x28329d320> {
    type: adjustment
    uti: com.apple.property-list
    filename: Adjustments.plist
    asset: 8B5B03FE-9862-4DD9-BB81-C9753FDE328B/L0/001
    locallyAvailable: YES
    fileURL: file:///var/mobile/Media/PhotoData/Mutations/PhotoData/CPLAssets/group125/5571C124-DF27-4636-9AFC-23786A33850B/Adjustments/Adjustments.plist
    width: 0
    height: 0
    fileSize: 7129
    analysisType: unavailable
    cplResourceType: Unknown
    isCurrent: NO
}, <PHAssetResource: 0x28329d440> {
    type: video_cmpl
    uti: com.apple.quicktime-movie
    filename: IMG_0067.MOV
    asset: 8B5B03FE-9862-4DD9-BB81-C9753FDE328B/L0/001
    locallyAvailable: YES
    fileURL: file:///var/mobile/Media/PhotoData/CPLAssets/group125/5571C124-DF27-4636-9AFC-23786A33850B.MOV
    width: 980
    height: 1308
    fileSize: 2403227
    analysisType: unavailable
    cplResourceType: OriginalVidCompl
    isCurrent: YES
}, <PHAssetResource: 0x28329cfc0> {
    type: photo
    uti: public.heic
    filename: IMG_0067.HEIC
    asset: 8B5B03FE-9862-4DD9-BB81-C9753FDE328B/L0/001
    locallyAvailable: YES
    fileURL: file:///var/mobile/Media/PhotoData/CPLAssets/group125/5571C124-DF27-4636-9AFC-23786A33850B.HEIC
    width: 3024
    height: 4032
    fileSize: 1331238
    analysisType: never-download
    cplResourceType: Original
    isCurrent: YES
}, <PHAssetResource: 0x28329d170> {
    type: photo_full
    uti: public.jpeg
    filename: FullSizeRender.jpg
    asset: 8B5B03FE-9862-4DD9-BB81-C9753FDE328B/L0/001
    locallyAvailable: YES
    fileURL: file:///var/mobile/Media/PhotoData/Mutations/PhotoData/CPLAssets/group125/5571C124-DF27-4636-9AFC-23786A33850B/Adjustments/FullSizeRender.jpg
    width: 4032
    height: 3024
    fileSize: 2036693
    analysisType: unavailable
    cplResourceType: JPEGFull
    isCurrent: NO
}]

1 Ответ

0 голосов
/ 22 апреля 2020

Я решил эту проблему, вручную запросив соответствующий ресурс с помощью PHAssetResourceManager.

Я не могу найти никаких документов, подтверждающих мою теорию, но я предполагаю, что при выполнении PHAssetChangeRequest новый PHAssetResource не устанавливается сразу как текущий. Или, может быть, есть какое-то действие, например создание экземпляра класса PHImageManager, который обновляет ресурсы, установленные на текущий.

Я использовал PHAssetResourceManager.requestData... для получения PHAssetResource с указанием c type собственность / свойства, которые я хотел. Это не так просто, как в оригинальном методе, на этот раз разделено на две разные функции, но это означает, что я не полагаюсь на милость PHImageManager для выбора соответствующего ресурса для извлечения.

    ///Loads the edited photos data using a completion handler
    private func getEditedPhotoData(photo: Photo, completionHandler: @escaping (Data?) -> ()){

        if let editedPhoto = PHAssetResource.assetResources(for: photo.asset).first(where: {$0.type == .fullSizePhoto || $0.type == .alternatePhoto}){
            PHAssetResourceManager.default().requestData(for: editedPhoto, options: nil, dataReceivedHandler: completionHandler, completionHandler: {
                error in

                if(error != nil){
                    completionHandler(nil)
                }
            })
        }else{
            completionHandler(nil)
        }

    }

    /// Loads the photos original data using a completion handler
    private func getOriginalPhotoData(photo: Photo, completionHandler: @escaping (Data?) -> ()){

        let options = PHImageRequestOptions()
        options.isNetworkAccessAllowed = true
        options.version = .original

        manager.requestImageDataAndOrientation(for: photo.asset, options: options, resultHandler: {
            data, uti, orientation, info in
            completionHandler(data)
        })

    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...