2017-08-23 3 views
0

私は迅速です。私はURLを使って画像をロードしていますsetImageWith URL完了ブロックスワイプ

上記のようにイメージのサイズを印刷すると、21 * 6.5になります。しかし、私がいつか待ってから印刷すると、寸法は188 * 109です。完了ブロックをsetImageWithに追加するにはどうすれば画像の読み込みが完了したかを知ることができます。

+2

受け入れられた回答を持つこのリンク、またはあなたがSwiftの新しい人としてhttps://stackoverflow.com/questions/24231680/loading-downloading-image-from-url-on-swiftを希望する人は、URLSessionをよく読んでみることをお勧めします将来:) –

+0

extern libを使用していますか?それとも自分でその方法を書きましたか? extern libにはブロックを含むメソッドが含まれている可能性があります(SDWebImageには、クロージャーが付いていないもの、閉じられていないものなどがあります)。 – Larme

答えて

2

あなたはUIIamgeに続いDataデータに完了ブロックでhttps://github.com/rs/SDWebImage

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

URLは常に最初にあなたが21の* 6.5寸法を持って、その後、実際の寸法188 * 109を得たThatsなぜイメージをロードするための時間がかかりますので、それが起こっています。

すべてのことを管理する第三者のライブラリSDWebImageを選択する最も良い方法は、画像のURLを設定するだけです。メソッド名があり

は、あなたが欲しいものは何でも管理できるように完了ブロックを持っている

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

です。

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!)) 
     }) 
    }) 
} 
0

コンバート画像URLを画像をロードするためSdwebimageを使用することができ、ここでの関数である -

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() 


}