【问题标题】:issue with image cache in getting image back firebase swift iOS图像缓存在获取图像时出现问题 firebase swift iOS
【发布时间】:2019-10-22 10:29:12
【问题描述】:

[][!我想使用图像缓存从 Firebase 的下载 url 加载图像我如何才能在我的图像被加载的地方创建继承我想我在某处缺少 OOP 概念。我的图像视图是滑动标签,如何创建一个可以在我的视图上显示图像的实例。

导入 UIKit

导入 Firebase

类 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 { 

返回 } 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"] as?字符串 {

  self.profileImageUrl = profileImageUrl

}

}
}

// 最后是图片缓存类customImageView

导入基础

导入 UIKit

var imageCache = String: UIImage

类 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 上看不到图像

【问题讨论】:

  • 这个问题有点不清楚。此外,您还没有在任何地方定义 var profileImageUrl,我们也不知道 `loadImage' 做了什么。请花点时间查看How do I ask a good question?How to create a Minimal, Complete, and Verifiable example
  • @jay 检查用户 profileImageUrl 的模型在我的模型中我已附上图片谢谢
  • 你在问如何Download an Image from Firebase Storage?此外,将代码和结构包含为文本而不是链接和图像也是一个好主意。见images and links are evil
  • @jay ok jay 给我一分钟我已经上传了所有代码
  • 几件事;在使用本网站时,我们需要能够清楚地阅读您的代码,因此格式化非常重要。第二件事是我们不想看到你所有的代码——只是不工作的部分。请参阅我上面的 cmets 并查看这两个链接。照原样,这个问题很可能会被否决并可能被关闭。

标签: ios swift firebase firebase-authentication


【解决方案1】:

您需要单独请求从 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

【讨论】:

  • 谢谢乔希,我会尽力给你投票,但由于分数低我不能投票,但谢谢。
猜你喜欢
  • 2018-08-13
  • 2020-08-17
  • 1970-01-01
  • 2017-07-14
  • 2018-06-11
  • 2017-12-02
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多