Для таблицы, в которой используется один источник данных, вы можете использовать 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()
}
}