Проблема: загрузка UIImage с URL-адресом, полученным из PHAsset, возвращает nil.
Контекст: у меня есть компонент пользовательского интерфейса, который работает с URL-адресами изображений и заполняется в разных частях приложения различными поставщиками.В конкретном случае я получаю PHAsset.
Код для запроса URL-адреса PHAsset:
let inputRequestOptions = PHContentEditingInputRequestOptions()
inputRequestOptions.isNetworkAccessAllowed = true
asset.requestContentEditingInput(with: inputRequestOptions, completionHandler: { (edittingInput, _) in
guard let url = edittingInput?.fullSizeImageURL else {
return
}
switch asset.mediaType {
case .image: editMediaContentContainerPresenter.assets = [.image(url)]
case .video: editMediaContentContainerPresenter.assets = [.movie(url)]
default:
debugPrint("unsupported asset")
}
})
Код для загрузки URL-адреса в UIImage внутри моего компонента пользовательского интерфейса:
func image(for url: URL, maximumPixelSize: CGFloat) -> UIImage? {
let options = [kCGImageSourceCreateThumbnailWithTransform: true,
kCGImageSourceCreateThumbnailFromImageAlways: true,
kCGImageSourceThumbnailMaxPixelSize: maximumPixelSize] as CFDictionary
guard let source = CGImageSourceCreateWithURL(url as CFURL, nil) else {
return nil
}
guard let imageReference = CGImageSourceCreateThumbnailAtIndex(source, 0, options) else {
return nil
}
return UIImage(cgImage: imageReference, scale: UIScreen.main.scale, orientation: .up)
}
Особые соображения: мне нужно преобразовать PHAsset в URL, потому что текущий компонент пользовательского интерфейса работает со многими другими поставщиками и частями приложения, и все они преобразуются в URL.Иногда загрузка с этого URL работает, но обычно максимально один раз.Чаще всего ему не удается загрузить UIImage с предоставленного URL.
Вопрос: Как получить действительный URL.
Решения уже приняты во внимание, но их следует избегать:
- загрузка изображения с запросами phasset, а затем его сохранение отдельно по локальному URL
- с передачей UIImage вместо URL