我是swift和IOS的新手,我可能有异步问题(不确定),我有一个firebase数据库,为我提供了Amazon S3上传内容的密钥和URL。我试图从S3下载图像,将它们存储在一个数组中,然后填充tableview。
代码似乎启动了下载,但它没有进展(进度的突破点甚至没有达到)
有人可以帮我介绍如何干净地填充我的tableview吗?我的图像数组总是空的,我不知道它是来自我的s3函数(但不会返回任何错误),或者它是否来自调度事件。
StringRequest request
答案 0 :(得分:0)
这个问题已经有几个月了,但万一你仍然遇到麻烦我会给我两分钱。
在我看来,问题在于确定何时刷新表格单元格(假设您从Firebase获取密钥的所有调用以及来自S3的数据都正常工作;如果他们不是,请考虑编写一些单元测试或使用一个操场,以确保您可以在视图控制器的上下文之外正确地获取数据,它会更快)。
获得Firebase参考后,您正在调用self.downloadImage(postitem.imagekey)
,然后调用self.tableView.reloadData()
。由于downloadImage
是异步的,因此当您重新加载表格时,您可能无法获得任何图片数据,因此这可能就是您似乎没有任何东西的原因。在您从S3填充images
数组后,必须调用您的表重新加载。
以下是我将如何做到这一点:
posts
和images
阵列都捆绑在一起;为什么不创建一个名为Posts
的结构,其中包含参数postInfo: getitems
和image: UIImage?
,您可能有也可能没有该帖子的图像?然后,tableView的数据模型将为var data: [Posts]
。每个Post
的图像参数为nil,直到从S3加载为止。viewDidLoad
:开始向Firebase查询帖子及其图片密钥。data: [Post]
并将.image
参数设置为nil,因为您还没有任何图片。添加完所有帖子后,您可以重新加载tableView。tableView:cellForRowAtIndexPath
中,如果data[indexPath.row].image
处的图片为nil
,您可以放置一个临时占位符UIImage,直到真实图像从S3加载为止。如果data[indexPath.row].image
不是nil,请设置实际图像。data: [Post]
。对于您返回的每个图像,仅重新加载该表格单元格。这将再次致电tableView:cellForRowAtIndexPath
。由于.image
参数将不再为零,您将看到实际图像替换占位符图像。以下是如何有效地更新特定行而不是重新加载整个表:
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)
tableView.endUpdates()
如果您在阵列中存储了许多大型UII图像,则可能存在内存问题,并且可能希望在将图像滚动到屏幕之前保留图像缓存并将图像加载几个索引而不是一次加载所有图像。