完成处理程序问题

时间:2017-08-03 14:33:11

标签: swift completionhandler

我有一个方法,我希望在准备好后返回结果。但我正在努力与2个完成处理程序。

这是代码。第一个完成处理程序是members.observesingleEvent。这将从数据库中返回许多键。然后我循环键以从另一个调用获取新值。我循环遍历值并执行另一个调用。

private func getRoomDevices(completionHandler : @escaping (Bool) -> ()){


members.observeSingleEvent(of: .value, with: { snapshot in
    if !snapshot.exists() { return  }

    let postDict = snapshot.value as! [String : AnyObject]

    for list in postDict {
        self.ref.child("groups/" + list.key).observeSingleEvent(of: .value, with: { groups in
            self.rooms.append(FirebaseApi().convertRoomDevices(snap: groups))
            print(groups.debugDescription)


        });
    }

    completionHandler(true)

})

我将所有内容添加到房间阵列中。但是,当for循环繁忙时,会调用completionHandler(true)。一切都完成后,需要调用completionHandler。

1 个答案:

答案 0 :(得分:3)

您必须使用DispatchGroup,在异步循环中添加所有项目,并且只有在组中的所有项目都已完成执行时才调用完成处理程序。

members.observeSingleEvent(of: .value, with: { snapshot in
    if !snapshot.exists() { return  }

    let postDict = snapshot.value as! [String : AnyObject]
    let group = DispatchGroup()
    for list in postDict {
        group.enter()
        self.ref.child("groups/" + list.key).observeSingleEvent(of: .value, with: { groups in
            self.rooms.append(FirebaseApi().convertRoomDevices(snap: groups))
            print(groups.debugDescription)
            group.leave()
        });
    }
    group.notify(queue: DispatchQueue.main) {
        completion(true)
    }

})