【问题标题】:Adding image from Firebase to UITableViewCell将图像从 Firebase 添加到 UITableViewCell
【发布时间】:2017-07-11 16:40:18
【问题描述】:

我想检索存储在用户存储中的图像,并将其放在自定义 UITableViewCell 中他的名字旁边。现在的问题是,当图像未完成下载(我认为?)时,tableview 将加载,导致应用程序崩溃,因为图像数组为 nil。那么加载tableview的正确方法是什么?我认为,为了用户体验,即使图像没有完成下载,也应该显示 tableviewcell 图像,并向它们呈现保存在助手中的默认图像,这一点很重要。我考虑过使用 UIImages 创建一个数组,该数组链接到加载图像的默认资产,并在下载完成后将图像更改为个人资料图片。但我真的不知道该怎么做。这是我到目前为止下载图像的结果:

let storage = FIRStorage.storage()
        let storageRef = storage.reference(forURL: "link.appspot.com")
        channelRef?.observeSingleEvent(of: .value, with: { (snapshot) in
            if let snapDict = snapshot.value as? [String:AnyObject]{
                for each in snapDict{
                    let UIDs = each.value["userID"] as? String
                    if let allUIDS = UIDs{
                        let profilePicRef = storageRef.child((allUIDS)+"/profile_picture.png")
                        profilePicRef.data(withMaxSize: 1 * 500 * 500) { data, error in
                            if let error = error {
                            }
                            if (data != nil)
                            {
                                self.playerImages.append(UIImage (data: data!)!)
                            }
                        }

                    }
let userNames = each.value["username"] as? String
                    if let users = userNames{
                        self.players.append(users)
                    }
                }
        }

        self.tableView.reloadData()
    })

这是在 cellForRow 中

cell.playersImage.image = playerImages[indexPath.row] as UIImage

我的规则,没有从默认规则改变它:

service firebase.storage {
  match /b/omega-towers-f5beb.appspot.com/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

谢谢。

【问题讨论】:

    标签: ios swift uitableview firebase firebase-storage


    【解决方案1】:

    关于用户体验,您是对的。从 URL 加载图像时,具有某种默认图像是标准的。 AlamofireImage

    是一个用于图像缓存和在其位置使用默认资产的出色库

    Vandan Patel 的回答是正确的,即在加载 tableview 时需要确保数组不为零。使用 AlamofireImage 库,您将获得一个完成块来处理您想要对图像执行的任何额外工作。

    这一切都假设您为 Firebase 用户获取了正确的图片网址。

    【讨论】:

    • 感谢您的评论。我看到一些关于 AlamofireImage 的好功能,但我担心回答我的问题。我认为我的代码不正确,因此将 Alamo 添加到我的项目不会修复我的代码。
    • 对不起,很难准确推断您的问题是什么。因此,如果您可以更简洁地详细说明,那么也许我可以提供帮助。我认为您最初的问题是如何使用占位符图像代替加载图像。
    【解决方案2】:

    图片下载完成后,您应该致电tableView.reloadData()。一件重要的事情,将你的 playerImages 初始化为 playerImages = [UIImage]() 而不是 playerImages: [UIImage]!。如果它为空,则不会显示您的数组为零。

    更新:

    if let players = playerImages {
       //code
    }
    

    【讨论】:

    • 对不起,我没有在我的代码中包含它。我已经像你一样初始化了 playerImages 。问题是表格会在视图出现时加载,它不会等待图像加载。但话又说回来,我想要检查数组是否包含图像,如果没有,则显示保存在资产中的正常图像。我不能在 cellForRow 中使用 if playerImages != nil。
    • 我已经编辑了我的答案。您只需使用 if let 语句即可检查 nil。如果为 nil,则不会进入 if 语句。还有一件事,如果你的数组被初始化并且为空,你的 numberofrowsinSection 应该返回 0,并且 cellforrowat IndexPath 不会给你一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    相关资源
    最近更新 更多