Как скачать изображение из iCloud без повторного сохранения?

У меня возникла проблема при попытке выбрать фотографию из галереи (приложение вылетает, когда я выбираю изображение, загруженное в iCloud). Поэтому моим первым решением было проверить, есть ли изображение на устройстве, а если нет, то загрузить его из iCloud.

Я использовал этот код

let manager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
requestOptions.resizeMode = .exact
requestOptions.deliveryMode = .highQualityFormat;

// Request Image
manager.requestImageData(for: asset, options: requestOptions, resultHandler: { (data, str, orientation, info) -> Void in
// Do somethign with Image Data
})

В этой ситуации я получаю imageData, но если я хочу его сохранить, он сохраняется в новую фотографию. Поэтому я получаю копию изображения в приложении "Фото" вместо одного исходного изображения, которое сохраняется на устройстве.

Итак, у меня вопрос, как загрузить изображение без его повторного сохранения. В основном я хочу такое же поведение, как в приложении для фотографий (когда фотография не на устройстве, она загружает фотографию и сохраняет ее в том же изображении, а не создает ее копию)


person Richard    schedule 13.01.2020    source источник


Ответы (1)


Я столкнулся с этой проблемой, вот способ решения:

Установите для isNetworkAccessAllowed значение false:

requestOptions.isNetworkAccessAllowed = false

Это потому, что вам нужно убедиться, что мы не получим его из iCloud. На этом этапе, если изображение не загружено, data в resultHandler должно быть nil:

manager.requestImageData(for: PHAsset(), options: requestOptions, resultHandler: { (data, str, orientation, info) -> Void in
    if let fetchedData = data {
        // the image is already downloaded
    } else {
        // the image is not downloaded...
        // now what you should do is to set isNetworkAccessAllowed to true
        // and make a new request to get it from iCloud.
    }
})

Кроме того, вы можете использовать PHImageResultIsInCloudKey:

manager.requestImageData(for: PHAsset(), options: requestOptions, resultHandler: { (data, str, orientation, info) -> Void in
    if let keyNSNumber = info?[PHImageResultIsInCloudKey] as? NSNumber {
        if keyNSNumber.boolValue {
            // its on iCloud...
            // read the "keep in mind" below note,
            // now what you should do is to set isNetworkAccessAllowed to true
            // and make a new request.
        } else {
            //
        }
    }
})

Как указано в документации PHImageResultIsInCloudKey, имейте в виду, что:

Если true, изображение не было предоставлено, потому что данные ресурса должны быть загружены из iCloud. Чтобы загрузить данные, отправьте другой запрос и укажите true для параметра isNetworkAccessAllowed.

person Ahmad F    schedule 13.01.2020
comment
Итак, если я установлю, разрешен ли доступ к сети, фотография будет загружена в исходное изображение без повторного сохранения? - person Richard; 14.01.2020