簡體   English   中英

setImageWith Url完成塊Swift iOS

[英]setImageWith Url completion block swift ios

我是新手。 我正在使用url加載圖像

mainImageView.setImageWith(URL(string: ("https:" + (content?.imagePath)!)), placeholderImage: nil)
print("dimensions after loading \(String(describing: mainImageView.image?.size))")

萬一我按上面所示打印圖像的尺寸,則尺寸為21 * 6.5。 但是,如果我等待一段時間再打印,則尺寸為188 * 109。 如何在setImageWith中添加完成塊,以便可以知道何時完成圖像加載?

您可以使用Sdwebimage來加載帶有完成塊的圖像https://github.com/rs/SDWebImage

imageView.sd_setImageWithURL(NSURL(string: urlString), completed: {
                (image, error, cacheType, url) in
                // you can get the image width here...
            })

之所以發生這種情況,是因為URL總是需要一些時間來加載圖像,這就是為什么首先獲得21 * 6.5尺寸,然后獲得實際尺寸188 * 109的原因

作為首選可管理所有內容的第三方庫SDWebImage的最佳方法,只需設置圖像URL。

有方法名稱是

open func sd_setImage(with url: URL!, placeholderImage placeholder: UIImage!, options: SDWebImageOptions = [], completed completedBlock: SDWebImage.SDWebImageCompletionBlock!)

具有完成塊,因此您可以管理所需的任何內容。

將圖片URL轉換為數據,然后將Data轉換為UIIamge ,這是一個函數:

func getImageFromUrl(_ strUrl: String, completionHandler handler: @escaping (_ img: UIImage) -> Void) {
    DispatchQueue.global(qos: .background).async {
        let url = URL(string: strUrl)
        let dataFromUrl = Data(contentsOf: url!)
        if dataFromUrl == nil {
            return
        }
        DispatchQueue.main.async(execute: {() -> Void in
            handler(UIImage(data: dataFromUrl!))
        })
    })
}

用這個: -

  let imageCache = NSCache<AnyObject, AnyObject>()
 typealias CompletionHandler = (_ success:Bool, _ image:UIImage?) -> Void





 func loadImageUsingCacheWithUrlString(_ urlString: 
 String,completionHandler: @escaping CompletionHandler) {
let image = UIImage()

    //check cache for image first
    if let cachedImage = imageCache.object(forKey: urlString as AnyObject) as? UIImage {
        image = cachedImage
        completionHandler(true, image!)
        return
    }

    if urlString.characters.count == 0 {
        completionHandler(false, image)
        return
    }

    //otherwise fire off a new download
    let url = URL(string: urlString)

    URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in

        //download hit an error so lets return out
        if error != nil {
            print(error ?? "")
            completionHandler(false,nil)
            return
        }

        DispatchQueue.main.async(execute: {
            if let downloadedImage = UIImage(data: data!) {
                image = downloadedImage
                imageCache.setObject(downloadedImage, forKey: urlString as AnyObject)                    

                completionHandler(true,image)
            }
        })

    }).resume()


}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM