Как использовать FirebaseUI с несколькими источниками данных для просмотра таблицы? - PullRequest
0 голосов
/ 04 марта 2020

Документация на FirebaseUI недостаточна. Как использовать разные источники данных для просмотра таблицы с помощью FirebseUI?

1 Ответ

0 голосов
/ 04 марта 2020

Для таблицы, в которой используется один источник данных, вы можете использовать FUIFirestoreTableViewDataSource или FirebaseTableViewDataSource. Вы можете связать любой из них с табличным представлением, используя запрос (такой как FIRQuery), таким образом:

let query: Query = self.db.collection("users").whereField("name", isEqualTo: "Taiwo")

self.dataSource = self.tableView.bind(toFirestoreQuery: query) { tableView, indexPath, snapshot in
   // get your data type out of the snapshot, create and return your cell.
}

Это очень хорошо работает для табличного представления с «единственным источником правды» и делает ваше табличное представление реагировать на изменения и т. д. c в базе данных без особой работы с вашей стороны.

Однако, в случае, когда вам нужно изменить данные на лету (например, когда вам нужно отобразить различные данные в зависимости от пользователя выбор), использование источника данных не будет работать. В этом случае вам необходимо использовать резервную копию из Firebase, такую ​​как FUIBatchedArray или FUIArray.

Это не сильно отличается от использования массива Swift вместе с источником данных вашего табличного представления. Единственное существенное отличие состоит в том, что вам нужно инициализировать массив, используя, как правило, ваш viewcontroller в качестве его делегата:

var datasourceArray = FUIBatchedArray(query: query, delegate: self)

Затем

extension MyViewController: FUIBatchedArrayDelegate {
   func batchedArray(_ array: FUIBatchedArray, didUpdateWith diff: FUISnapshotArrayDiff<DocumentSnapshot>) {
        // you'll receive changes to your array in `diff` and `array` is a whole array with 
        // all new changes together with old data
        datasourceArray = array
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }

    func batchedArray(_ array: FUIBatchedArray, willUpdateWith diff: FUISnapshotArrayDiff<DocumentSnapshot>) {

    }

    func batchedArray(_ array: FUIBatchedArray, queryDidFailWithError error: Error) {

    }
}

Затем вы можете использовать datasourceArray, как если бы Swift массив в ваших методах UITableViewDataSource:

extension MyViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return datasourceArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let snapshot = datasourceArray.object(at: indexPath.row)

        do {
            let task = try snapshot.data(as: Task.self)
            // create, customise and return your cell
            }
        }
        catch {
            print("coudln't get data out of snapshot", error.localizedDescription)
        }

        return UITableViewCell()
    }
}
...