我有一个视图,我正在使用数据源来配置该视图。 dataSource从两个单独的Firebase调用getA
和getBCD
中获取数据。但是,由于firebase调用是异步的,因此我在didSet中为BCD设置了View.DataSource
,但无法弄清楚如何使用来自BCD的信息为A设置数据源。更好的方法是创建带有单独init的两个单独的dataSource,以使视图配置不取决于首先返回哪个Firebase调用吗?还是使用group.notify
?
ViewController的相关代码行:
class ViewController: UIViewController {
private var BCDDictionary = [String:Int]() {
didSet {
let B = BCDDictionary["B"]
let C = BCDDictionary["C"]
let D = BCDDictionary["D"]
self.AView.dataSource = AView.DataSource(A:10, B:B, C:C, D:D)
// A is hardcoded currently
}
}
private var A: Int
override init() {
super.init()
_ = FirebaseAPI.shared.getA { [weak self] result in
DispatchQueue.main.async {
switch result {
case .success(let A):
self?.A = A
case .failure(let error):
print(error)
}
}
}
_ = FirebaseAPI.shared.getBCD(completion: {[weak self] result in
DispatchQueue.main.async {
switch result {
case .success(let BCD):
self?.BCDDictionary = (self?.countBCD(BCD: BCD))!
// Turns BCD into the proper dictionary
case .failure(let err):
print(err)
}
}
})
}
View的相关代码行:
final class AView: UIView {
struct DataSource {
let numberOfA: Int
let numberOfB: Int
let numberOfC: Int
let numberOfD: Int
}
var dataSource: DataSource? {
didSet {
self.numberOfALabel.text = String(self.dataSource!.numberOfA)
self.numberOfBLabel.text = String(self.dataSource!.numberOfB)
self.numberOfCLabel.text = String(self.dataSource!.numberOfC)
self.numberOfDLabel.text = String(self.dataSource!.numberOfD)
}
}
}
extension AView.DataSource {
init(A: Int, B: Int, C: Int, D: Int) {
self.numberOfA = A
self.numberOfB = B
self.numberOfC = C
self.numberOfD = D
}
}
答案 0 :(得分:0)
由于有2个异步任务,并且应同时由它们初始化dataSource,所以最佳选择是
let group = DispatchGroup()