Получить UIImage только с библиотекой Kingfisher

Мне нужно получить только UIImage вместо загрузки обычного UIImageView с библиотекой Kingfisher

Чтобы реализовать это, я реализовал обходной путь с UIImageView:

let imageView = UIImageView()

imageView.kf_setImageWithURL(NSURL(string: cpa.imageName)!, placeholderImage: nil,
        optionsInfo: [.Transition(ImageTransition.Fade(1))],
        progressBlock: { receivedSize, totalSize in
            print("\(receivedSize)/\(totalSize)")
        },
        completionHandler: { image, error, cacheType, imageURL in
            anView!.image = image //anView IS NOT an UIImageView
            anView!.frame.size = CGSize(width: 15.0, height: 15.0)
            print("Finished")
    })

Этот код работает отлично, но я бы хотел сделать это более понятным способом. Есть ли в этой библиотеке метод для получения только UIImage? Асинхронный и кэшированный

10 ответов

Решение

Вы могли бы использовать retrieveImage(with:options:progressBlock: completionHandler:) метод KingfisherManager за это.

Может быть, что-то вроде этого:

KingfisherManager.shared.retrieveImage(with: url, options: nil, progressBlock: nil, completionHandler: { image, error, cacheType, imageURL in
    print(image)
})

Это последний синтаксис для загрузки изображения в kingFisher (протестировано в swift 4.2)

KingfisherManager.shared.retrieveImage(with: resource, options: nil, progressBlock: nil) { result in
                    switch result {
                    case .success(let value):
                        print("Image: \(value.image). Got from: \(value.cacheType)")
                    case .failure(let error):
                        print("Error: \(error)")
                    }
                }

С новой версией Swift 3 вы можете использовать ImageDownloader:

ImageDownloader.default.downloadImage(with: url, options: [], progressBlock: nil) {
    (image, error, url, data) in
    print("Downloaded Image: \(image)")
}

Swift 5:

Я завершу ответ @Hardik Thakkar, чтобы добавить изменение, чтобы вы могли вернуть изображение, используя закрытие, которое может кому-то помочь:

   func downloadImage(with urlString : String , imageCompletionHandler: @escaping (UIImage?) -> Void){
    guard let url = URL.init(string: urlString) else {
        return  imageCompletionHandler(nil)
    }
    let resource = ImageResource(downloadURL: url)
    
    KingfisherManager.shared.retrieveImage(with: resource, options: nil, progressBlock: nil) { result in
        switch result {
        case .success(let value):
            imageCompletionHandler(value.image)
        case .failure:
            imageCompletionHandler(nil)
        }
    }
}

Как позвонить:

 downloadImage(with :yourUrl){image in
            guard let image  = image else { return}
            // do what you need with the returned image.
        }

Свифт 5 Зимородок 5

Этот код на 100% рабочий

      YourImageView.kf.setImage(with: URL(string: imagePath), placeholder: nil, options: nil, progressBlock: nil, completionHandler: { result in
switch result {
    case .success(let value):
                print("Image: \(value.image). Got from: \(value.cacheType)")
    case .failure(let error):
                print("Error: \(error)")
    }
})

В зимородке 5

imageView.kf.setImage(with: url) { result in
   switch result {
   case .success(let value):
       print("Image: \(value.image). Got from: \(value.cacheType)")
   case .failure(let error):
       print("Error: \(error)")
   }
 } 

увидеть больше: https://github.com/onevcat/Kingfisher/wiki/Kingfisher-5.0-Migration-Guide

Еще один способ в Kingfisher 5:

KingfisherManager.shared.retrieveImage(with: url) { result in
    let image = try? result.get().image
    if let image = image {
        ...
    }
}

Если вы хотите иметь собственные UIImage и UIImageView

      let url = URL(string: "https://iosacademy.io/assets/images/brand/icon.jpg")

override func viewDidLoad() {
    super.viewDidLoad()
    addPicture()
    
}

private func addPicture() {
    let containerView = UIView()
    //let myImage = UIImage(named: "Old Scroll Lengmei") // to add UIImage  by code
    let myImage = UIImage()
    let myImageView = UIImageView() // to add UIImageView by code
    let label = UILabel() // to add Label by code
    
    myImageView.kf.setImage(with: url)

Если вы хотите настроить UILabel, созданный для UIImageView из вызова API.

      import Kingfisher
      func getImage(imageUrl: String,title:String?=nil){

        let someTitle = UILabel()
        view.addSubview(someTitle)
        someTitle.text = title
        someTitle.isHidden = true
       
        someTitle.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
        someTitle.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
        someTitle.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
        someTitle.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true

        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [self] in
            let url = URL(string: imageUrl )
            yourImage.kf.setImage(
                with: url,
                placeholder:  (someTitle as? Placeholder),
                options: [
                    .loadDiskFileSynchronously,
                    .cacheOriginalImage,
                    .transition(.fade(0.25))
                ],
                completionHandler: { result in
                    // Done
                    switch result {
                    case .success(let value):
                         self.yourImage.image = value.image
                    case .failure(let error):
                        someTitle.isHidden = false
                    }
                }
            )
                        
        }
    }

Просто вызовите функцию в своем контроллере

      
getImage(imageUrl: you_url, title: your_name)

Swift 5 этот код на 100% рабочий

let url = URL(string: USER_IMAGE_PATH + "\(arrGuserpic[index])")
            
cell.imgv.kf.setImage(with: url, placeholder: nil, options: nil, progressBlock: nil, completionHandler: { image, error, cacheType, imageURL in
if (image != nil){
    cell.imgv.image = image
} 
else {
    cell.imgv.image = UIImage.init(named: "user")
}
})
Другие вопросы по тегам