Как использовать SDWebImage для загрузки и сохранения CGImage - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь использовать SDWebImage для загрузки и изображения с внешнего URL-адреса и вернуть его. Я не хочу устанавливать это в представлении. Это код, который я использую, но он не работает. Я возвращаю ноль. Но я знаю URL, который я передаю в работах, потому что я вижу его в браузере. Что я делаю неправильно?

func downloadImage() -> CGImage {
   var myImage: CGImage?
   let myUrl = URL(string: "my-url-here.com")

   SDWebImageDownloader.shared.downloadImage(with: myUrl, completed: { (image, data, error, true) in
       print("Completed")
       if image != nil {
           myImage = image?.cgImage
       }
   })

   return myImage!
}

Я тоже пробовал эту версию, тоже не повезло:

func downloadImage() -> CGImage {
    var myImage: CGImage?
    let myUrl = URL(string: "my-url-here.com")

    SDWebImageManager.shared.loadImage(with: myUrl, options: .continueInBackground, progress: { (received, expected, nil) in
        print(received, expected)
    }, completed: { (downloadedImage, data, error, SDImageCacheType, true, imageUrlString) in
        DispatchQueue.main.async {
            if downloadedImage != nil {
                myImage = downloadedImage?.cgImage
            }
        }
    })

    return myImage!
}

1 Ответ

1 голос
/ 01 апреля 2020

SDWebImage - асинхронная библиотека. Вы не можете просто return результаты. Как правило, можно использовать закрытие @escaping для предоставления результатов вызывающей стороне. Например,

func downloadImage(completion: @escaping(CGImage?) -> Void) {
    let url = URL(string: "https://my-url-here.com")!

    SDWebImageDownloader.shared.downloadImage(with: url) { image, _, _, _ in
        completion(image?.cgImage)
    }
}

И вы бы использовали это как:

downloadImage { image in
    guard let image = image else { return }

    // use image here
}

// but not here

Но давайте вернемся назад и посмотрим на весь шаблон. Вы говорите, что хотите «сохранить» результат. Если вы говорите о сохранении его в постоянном хранилище, вы вообще не захотите использовать CGImage (или UIImage или что-то еще). Это вычислительно неэффективно (преобразование ресурса в изображение, а затем обратно в Data, чтобы вы могли его сохранить), неэффективное пространство (вам нужно загрузить весь ресурс в память одновременно) и, вероятно, создает проблемы (например, если вы загружаете JPG, преобразуйте в CGImage, а затем попытайтесь воссоздать JPG, результирующий актив будет немного другим, большим и / или с новыми артефактами JPG). Если вы просто предварительно загружаете ресурсы, просто используйте простую сетевую библиотеку, такую ​​как Alamofire или URLSession.

...