使用Firebase中的图像填充表格视图

时间:2015-12-22 04:54:28

标签: objective-c uitableview firebase data-retrieval

我最近问过这个问题:Populating a UITableView in Firebase a Set Number of Cells at a time

但通过讨论,我意识到问题实际上是两个问题,所以我要为第二个问题开始第二个问题:

人们通常使用Firebase从大型数据集中填充图像的表格视图吗?

以下是我用于检索图片的代码。图像是base64编码的NSStrings。

NSString* profPicString= [child.value objectForKey: @"profilePicture"];
    NSData *dataFromBase64=[NSData base64DataFromString:profPicString];
    UIImage *profPicImage = [[UIImage alloc]initWithData:dataFromBase64];
    item.profilePicture = profPicImage;

但是,图像需要很长时间才能下载。只需10张图像的桌面视图需要5或10秒才能加载。如果它像这样有10个图像,那将是数百或数千的真正冰川。

我怀疑我是第一个遇到这个问题的人,我想知道是否有更好/更有效的方法吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

如果您要将图像存储为base64编码字符串,请将它们存储在Firebase数据库中的单独位置。

{
   "pokemon": {
      "001": {
         "name": "Bulbasaur"
      },
      "002": {
         "name": "IvySaur"
      }
   },
   "images": {
      "001": "big-ole-base64-string",
      "002": "big-ole-base64-string"
   }
}

这样您就可以在不需要下拉图像的情况下加载主数据。

现在,当您为UITableView加载数据时,请为主要数据集创建一个侦听器,在这种情况下为/pokemon

然后当你到达tableView(_:cellForRowAtIndexPath)时,创建一个一次性的监听器来抓取图像。

此示例位于Swift中,但您可以转换为Objective-C。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCellWithIdentifier("PokeCell") as! PokeTableViewCell

  let pokeSnap = pokemonSnaps[indexPath.item]

  let imageRef = rootRef.childByAppendingPath("images").childByAppendingPath(pokeSnap.key)

  imageRef.observeSingleEventOfType(.Value) { (imageSnap: FDataSnapshot!) in
    let base64String = imageSnap.value as! String
    let decodedData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions(rawValue: 0))
    let image = UIImage(data: decodedData!)
    cell.pokeImage.image = image
  }

  return cell   
}

这种方法的优点在于您只需在需要时加载图像,而不是使用主要数据集。

Check out this repo of mine that implements this technique.

答案 1 :(得分:2)

这样做的新推荐方法是使用Firebase Storage,这是Firebase的新文件和图像存储解决方案。您可以将此功能与SDWebImage结合使用,以显示您已上传到Firebase存储的图像。

我们很快会使用此信息更新所有样本/回购:)