我正在尝试从两个不同的Firebase表中获取数据.这是表的结构:
Post { 1{ pImages{ i1:true i2:true } } 2{ pImages{ i3:true } } } Images{ i1{ iUrl : .... pId : 1 } i2{ iUrl :... pId : 1 } i3{ iUrl:.... pId : 2 } }
我需要检索对应于id为1的post的图像.以下是我检索图像的实现:
func retrieveImagesForPost(postId: String,completion: (result: AnyObject?,error: NSError?)->()){ var imgArray:[Image]=[] let postsRef = self.ref.child("post") let imagesRef = self.ref.child("image") let postImagesRef = postsRef.child(postId).child("pImages"); postImagesRef.observeEventType(FIRDataEventType.Value,withBlock: { (snapshot) in for item in snapshot.children{ imagesRef.child(item.key).observeSingleEventOfType(.Value,withBlock: { (snap) in let image = Image(snapshot: snap) print(image) imgArray.append(image) }) } print(snapshot.key) print("called") completion(result:imgArray,error:nil) }) }
但是,问题是我无法将imgArray中的所有图像都能够发送到完成处理程序.下面是调用retrieveImagesForPost并输出id == 1的输出.
pImages called <TestProject.Image: 0x7f9551e82000> <TestProject.Image: 0x7f955466a150>
在调用完成处理程序之后检索图像.我尝试了调度组和信号量方法,如下面的post所述.但结果仍然相同.如何使完成处理程序等待从Firebase获取所有图像?
解决方法
保留一个在每个图像加载时增加的计数器.一旦计数器达到snapshot.children列表的长度,您就完成了并调用了完成处理程序.
let postImagesRef = postsRef.child(postId).child("pImages"); postImagesRef.observeEventType(FIRDataEventType.Value,withBlock: { (snapshot) in var counter = 0 for item in snapshot.children{ imagesRef.child(item.key).observeSingleEventOfType(.Value,withBlock: { (snap) in let image = Image(snapshot: snap) print(image) imgArray.append(image) counter = counter + 1 if (counter == snapshot.childrenCount) { completion(result:imgArray,error:nil) } }) } })
您可能应该在上面添加一些错误处理,但通常这种方法是经过尝试和测试的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。