【问题标题】:Completion handler problems完成处理程序问题
【发布时间】:2017-08-03 14:33:11
【问题描述】:

我有一个方法,我想在它准备好时返回结果。但我正在为 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。

【问题讨论】:

    标签: swift completionhandler


    【解决方案1】:

    您必须使用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)
        }
    
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      相关资源
      最近更新 更多