【问题标题】:using the image assigned to userprofile in firebase and attachine it to profile page在firebase中使用分配给用户配置文件的图像并将其附加到配置文件页面
【发布时间】:2020-08-24 01:22:53
【问题描述】:

我一直在网上到处寻找以帮助我,但我无法弄清楚这一点。下面的代码表示允许图像在用户注册时存储在 firebase 数据库中:

func uploadProfileImage(_ image: UIImage, completion: @escaping ((_ url: URL?)->())){
    guard let uid = Auth.auth().currentUser?.uid else {return}
    let storageRef = Storage.storage().reference().child("user/\(uid)")

    guard let imageData = image.jpegData(compressionQuality: 0.75 ) else {return}
    let metaData = StorageMetadata()
    metaData.contentType = "image/jpg."


    storageRef.putData(imageData, metadata: metaData) { metaData, error in
        if error == nil, metaData != nil {
            storageRef.downloadURL { url, error in
                completion(url)
                // success!
            }
        } else {
            // failed
            completion(nil)
        }
    }
}

func saveProfile(name: String, email: String, profileImageURL: URL, completion: @escaping ((_ success:Bool)->())){
    guard let uid = Auth.auth().currentUser?.uid else {return}

    let databaseRef = Database.database().reference().child("users/profile/\(uid)")


    let userObject = ["name":name, "email":email,
                      "photoURL":profileImageURL.absoluteString] as [String:Any]

    databaseRef.setValue(userObject) {error, ref in completion(error == nil)}
    }
}

另一个 .swift 文件中的这段代码让我可以获取照片:

static let cache = NSCache<NSString, UIImage>()

static func downloadImage(withURL url:URL, completion: @escaping (_ image:UIImage?, _ url:URL)->()) {
    let dataTask = URLSession.shared.dataTask(with: url) { data, responseURL, error in
        var downloadedImage:UIImage?

        if let data = data {
            downloadedImage = UIImage(data: data)
        }

        if downloadedImage != nil {
            cache.setObject(downloadedImage!, forKey: url.absoluteString as NSString)
        }

        DispatchQueue.main.async {
            completion(downloadedImage, url)
        }

    }

    dataTask.resume()
}

static func getImage(withURL url:URL, completion: @escaping (_ image:UIImage?, _ url:URL)->()) {
    if let image = cache.object(forKey: url.absoluteString as NSString) {
        completion(image, url)
    } else {
        downloadImage(withURL: url, completion: completion)
    }
}

用户个人资料代码:

class UserProfile {

var uid:String
var name:String
var photoURL:URL

init(uid:String, name:String, photoURL:URL){

    self.uid = uid
    self.name = name
    self.photoURL = photoURL



}

}

我添加了一个文件,可以让我从 firebase 获取数据:

class ImageServices{

static let cache = NSCache<NSString, UIImage>()

static func downloadImage(withURL url:URL, completion: @escaping (_ image:UIImage?, _ url:URL)->()) {
    let dataTask = URLSession.shared.dataTask(with: url) { data, responseURL, error in
        var downloadedImage:UIImage?

        if let data = data {
            downloadedImage = UIImage(data: data)
        }

        if downloadedImage != nil {
            cache.setObject(downloadedImage!, forKey: url.absoluteString as NSString)
        }

        DispatchQueue.main.async {
            completion(downloadedImage, url)
        }

    }

    dataTask.resume()
}

static func getImage(withURL url:URL, completion: @escaping (_ image:UIImage?, _ url:URL)->()) {
    if let image = cache.object(forKey: url.absoluteString as NSString) {
        completion(image, url)
    } else {
        downloadImage(withURL: url, completion: completion)
    }
}

}

现在我如何在我的 viewController 中使用它来在 imageView 上实际显示图像???

【问题讨论】:

  • 问题不清楚。 viewControllers 没有个人资料页面,所以也许这是您添加到 your viewController 的内容?另外,您是在询问 Firebase 用户对象的 .photoUrl 属性吗?或者您是在问如何从 Firebase 中读取节点 /photoURL 节点?如果您尝试读取 Firebase 节点的值,请参阅入门指南 Read Data。我建议您对其进行审查,然后澄清并更新您的问题。
  • 我要问的是如何从当前登录的用户那里获取图像并将其附加到我已命名为我的个人资料页面的不同视图控制器中的图像。
  • 如果你想获取头像,你会从当前用户对象中获取profileUrl。见Get A Users Profile。知道 URL 或拥有图像后,您就可以在应用程序中的任意位置使用它。
  • 这在代码中会是什么样子,因为我在网站上没有完全理解它抱歉。这必须适用于已登录的任何人。我添加了一个 userProfile 以获取配置文件 url,如编辑后的问题所示。
  • 可以这样做,但 Firebase 为当前用户提供了 photoUrl 属性,为什么不使用它呢?然后任何时候你想显示,let photoUrl = Auth.auth().currentUser.photoUrl 然后查看this question 的答案以下载和填充 imageView。另一方面,它可以向自己显示用户图像,但如果您希望其他人看到图像,则可以按照您的问题中的建议将 url 保存在 /users/uid_x/profileUrl 中。不知道问题到底是什么。

标签: swift firebase firebase-realtime-database firebase-storage


【解决方案1】:

问题的最后一次编辑问这个

现在我如何在我的 viewController 中使用它来实际显示图像 在 imageView 上???

这表明您有一个包含 imageView 的 viewController,因为您正在询问如何将下载的图像分配给该 imageView。

图片在你的代码中下载

static func downloadImage(withURL...
        var downloadedImage:UIImage
        if let data = data {
            downloadedImage = UIImage(data: data)

接下来的一行代码将获取下载的图像并将其显示在 imageView 中

self.myImageView.image = downloadedImage

【讨论】:

  • 不幸的是,这不起作用。我也将该行复制到我的 viewDidLoad 中,但它也不起作用:/.
  • @UsmaanMahmood 它对我有用,因为它直接来自一个功能齐全的项目。我建议删除这个问题,使用您正在尝试的当前代码创建一个新问题(根据我的建议),更清楚地描述您遇到的问题 使用该代码 以及故障排除你已经完成了。说它不起作用并不能真正告诉我们什么——什么不起作用?它崩溃了吗?数据变量是否未填充?项目根本就没有开始吗?我们需要准确和具体的数据来帮助您 - 否则您的问题将被关闭。
猜你喜欢
  • 2020-02-04
  • 1970-01-01
  • 2013-05-28
  • 2012-03-08
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
相关资源
最近更新 更多