通过在iOS中连接表来从Firebase获取数据

前端之家收集整理的这篇文章主要介绍了通过在iOS中连接表来从Firebase获取数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试从两个不同的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)
            }
        })
    }
})

您可能应该在上面添加一些错误处理,但通常这种方法是经过尝试和测试的.

猜你在找的iOS相关文章