繁体   English   中英

在获取图像回火码swift iOS时出现图像缓存问题

[英]issue with image cache in getting image back firebase swift iOS

在此输入图像描述 [ 在此输入图像描述 ] [!我希望使用图像缓存从firebase下载URL加载图像如何创建我的图像加载的继承我想我在某处缺少OOP概念。 我的图片视图是刷卡标签,如何创建一个实例,我可以在我的视图上显示图像。

导入UIKit

导入Firebase

class swipeLabelViewController:UIViewController {

@IBOutlet weak var UserAgeText: UILabel!


var user:User? {

    didSet {


        let userNameSwipe = user?.userName

        userNameLabel.text = userNameSwipe

        let userAgeSwipe = user?.userAge

        UserAgeText.text = userAgeSwipe

        guard let profileImageUrl = user?.profileImageUrl else { 

return} profileImageView.loadImage(with:profileImageUrl)

        print(profileImageUrl)

  //  let userFetchedImage = user?.profileImageUrl

     //   swipeLabel.image = userFetchedImage

       // self.swipeLabel.image = UIImage(contentsOfFile: profileImageUrl)

     }
}
var profileImageView: CustomImageView = {


    let iv = CustomImageView()


    return iv

}()


var imageI : UIImage!

// var swipepic = CustomImageView()

@IBOutlet weak var swipeLabel: UIImageView!


@IBOutlet weak var userNameLabel: UILabel!




override func viewDidLoad() {


    super.viewDidLoad()


   swipeLabel.image = imageI


    let gesture = UIPanGestureRecognizer(target: self, action: 

选择器(wasDragged(gestureRecognizer :)))

 swipeLabel.addGestureRecognizer(gesture)



 fetchCurrentUserData() 


    }

//用户模型类``

class User {

// attributes getting users info  so i can set up  from  firebase





var userName:String!


var userAge:String!


var uid:String!


var profileImageUrl: String!

init(uid:String,dictionary:Dictionary){

self.uid = uid

if let userName = dictionary [ "userName" ] as? String{


    self.userName = userName

}

if let userAge = dictionary [ "userAge" ] as? String{


    self.userAge = userAge
}

如果让profileImageUrl = dictionary [“profileImageURL”]为? 字符串{

  self.profileImageUrl = profileImageUrl

}

}
}

//最后是图像缓存类customImageView

进口基金会

导入UIKit

var imageCache = String:UIImage

class CustomImageView:UIImageView {

var lastImgUrlUsedToLoadImage: String?


func loadImage(with urlString: String) {


    // set image to nil


    self.image = nil

    // set lastImgUrlUsedToLoadImage


    lastImgUrlUsedToLoadImage = urlString


    // check if image exists in cache


    if let cachedImage = imageCache[urlString] {


        self.image = cachedImage

        return
    }

    // url for image location




    guard let url = URL(string: urlString) else { return }





    // fetch contents of URL


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

        // handle error


        if let error = error {


            print("Failed to load image with error", 

error.localizedDescription)}

        if self.lastImgUrlUsedToLoadImage != url.absoluteString {

            return
        }

        // image data
        guard let imageData = data else { return }



        // create image using image data


        let photoImage = UIImage(data: imageData)



        // set key and value for image cache


        imageCache[url.absoluteString] = photoImage


        // set image

        DispatchQueue.main.async {

            self.image = photoImage
        }

        }.resume()
}

}

没有错误我只是看不到我的swipelabel UIImage上的图像

您需要单独请求从firebase返回的URL下载图像。 这是一个游乐场示例:

//: A SpriteKit based Playground

import PlaygroundSupport
import UIKit

enum ImageDownloadError: Error {
  case failedToConvertDataToImage
}

func dowloadImage(from url: URL, completion: @escaping (Result<UIImage, Error>) -> Void) {
  let task = URLSession.shared.dataTask(with: url) { data, response, error in
    guard let image = data.flatMap(UIImage.init(data:)) else {
      return completion (.failure(error ?? ImageDownloadError.failedToConvertDataToImage))
    }
    completion(.success(image))
  }.resume()
}

let imageView = UIImageView()
dowloadImage(from: URL(string: "https://res.cloudinary.com/demo/image/upload/sample.jpg")!) { [weak imageView] result in
  switch result {
  case .failure(let error):
    print(error.localizedDescription)
  case .success(let image):
    imageView?.image = image
  }
}
imageView.frame = .init(origin: .zero, size: .init(width: 300, height: 300))
PlaygroundPage.current.liveView = imageView
PlaygroundPage.current.needsIndefiniteExecution = true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM