Как загрузить изображение из iCloud без его повторного сохранения? - PullRequest
0 голосов
/ 13 января 2020

Я столкнулся с проблемой при попытке выбрать фотографию из галереи (приложение вылетает, когда я выбираю изображение, загруженное в 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 в этой ситуации, но если я хочу сохранить его, он сохраняется в новое фото . Таким образом, я получаю копию изображения в Фото, вместо этого получаю один оригинальный образ e, который хранится на устройстве.

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

1 Ответ

0 голосов
/ 13 января 2020

Я столкнулся с этой проблемой, вот обходной путь:

Установите 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.

...