之前,我想从火力下载:从组配置文件发出等待2个回调实例化对象
- 数据(火力地堡实时DB) 包括...从发行
- 数据组管理轮廓(火力地堡实时DB)
- 一组配置文件图像(火力地堡存储)
然后我可以实例化其数据的一组对象及其图像
第一方法中,我使用的3嵌套闭合,让我获取数据,然后,以获得图像。
它确实有效,但从Firebase获取所有这些东西的时间相当长。
因此,我尝试使用GCD,以便在同一时间(而不是一个接一个地)推送我最近的2个Firebase查询(用户数据+组图像),并等待最后一个回调开始实例化我的组。
这是一个正确的方法吗?
如果是的话,我觉得有些困难来实现它... 我的问题:returnedUser和returnedGroupImage总是零
这里是我的一堆代码:
static func getGroup(_ groupID:String, completionBlock: @escaping (_ group: Group?) ->()) {
dataRef.child("data").child("groups").child(groupID).observe(.value, with: { (snapshot) in
if let snapshotValue = snapshot.value {
guard let name = (snapshotValue as AnyObject).object(forKey: "name") as? String else
{
completionBlock(nil)
return
}
guard let adminID = (snapshotValue as AnyObject).object(forKey: "adminID") as? String else
{
completionBlock(nil)
return
}
let queue = DispatchQueue(label: "asyncQueue", attributes: .concurrent, target: .main)
let dispatch_group = DispatchGroup()
var returnedUser: User?
var returnedGroupImage: UIImage?
queue.async (group: dispatch_group) {
FireBaseHelper.getUser(adminID, completionBlock: { (user) in
if user != nil {
returnedUser = user
}
})
}
queue.async (group: dispatch_group) {
FireBaseHelper.getGroupImage(groupID, completionBlock: { (image) in
if image != nil {
returnedGroupImage = image
}
})
}
dispatch_group.notify(queue: DispatchQueue.main) {
// Single callback that is supposed to be executed after all tasks are complete.
if (returnedUser == nil) || (returnedGroupImage == nil) {
// always true !
return
}
let returnedGroup = Group(knownID: (snapshotValue as AnyObject).key, named: name, createdByUser: currentUser!)
returnedGroup.groupImage = returnedGroupImage
completionBlock(returnedGroup)
}
}
})
}
感谢您的帮助!
'FireBaseHelper.getUser'和'FireBaseHelper.getGroupImage'是异步函数。我相信你在这里使用'DispatchGroup'的方式看起来不正确。 – KrishnaCA