DataSource配置带有多个Firebase调用的视图

时间:2018-07-27 22:26:19

标签: ios swift firebase model-view-controller swift4

我有一个视图,我正在使用数据源来配置该视图。 dataSource从两个单独的Firebase调用getAgetBCD中获取数据。但是,由于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
    }
}

1 个答案:

答案 0 :(得分:0)

由于有2个异步任务,并且应同时由它们初始化dataSource,所以最佳选择是

let group = DispatchGroup()