tri*_*Ant 6 ios firebase completionhandler firebase-realtime-database
我正在尝试从两个不同的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
}
}
Run Code Online (Sandbox Code Playgroud)
我需要检索对应于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)
})
}
Run Code Online (Sandbox Code Playgroud)
但是,问题是我无法将所有图像imgArray都能够发送到completion handler.以下是retrieveImagesForPost使用post id == 1 调用的输出.
pImages
called
<TestProject.Image: 0x7f9551e82000>
<TestProject.Image: 0x7f955466a150>
Run Code Online (Sandbox Code Playgroud)
调用后检索图像completion handler.我尝试了以下帖子中描述dispatch groups的semaphores方法和方法.但结果仍然相同.如何等待从Firebase获取所有图像?completion handler
保留一个在每个图像加载时增加的计数器.一旦计数器达到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)
}
})
}
})
Run Code Online (Sandbox Code Playgroud)
您可能应该在上面添加一些错误处理,但通常这种方法是经过尝试和测试的.
| 归档时间: |
|
| 查看次数: |
1866 次 |
| 最近记录: |