FireStore Swift: доступ к счетам и деталям документа для использования в таблице - PullRequest
1 голос
/ 06 марта 2019

Код из FireStore Swift 4: Как получить общее количество всех документов в коллекции и получить сведения о каждом документе? правильно выводится на консоль при вызове в части viewDidLoad моего TableViewController. Однако я пытаюсь использовать «count» для количества строк и выбрать некоторые детали документа для отображения в таблице.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что эти детали кажутся заблокированными в этом вызове QuerySnapshot, и я не могу получить к ним доступ через numberOfRowsInSection и CellForRowAt. Я использую версию 10 XCode. Извините, если это нубский вопрос, но я какое-то время был в тупике.

var count = 0
override func viewDidLoad() {
    super.viewDidLoad()

    let reviewTopic = Firestore.firestore().collection("usersIds").document(userEmail!).collection("reviews")
    reviewTopic.getDocuments() {
        (QuerySnapshot,err) in

        if let err = err {
            print("Error getting documents: \(err)");
        } else {
            for document in QuerySnapshot!.documents {
                self.count += 1
                print("\(document.documentID) => \(document.data())");
            }
            print("Count = \(self.count)"); 
        }
        print("Count from viewDidLoad: ", self.count) // prints 2
    }
}

Опять же, приведенное выше возвращает правильные count (2) и детали документа, но я пытаюсь использовать значение в numberOfRowsInSection, которое выполняется перед viewDidLoad и возвращает 0.

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    print("Count from numrows: ", self.count)
    return self.count //returns value of 0
}

1 Ответ

0 голосов
/ 06 марта 2019

Вы забыли перезагрузить UITableView после получения данных с сервера, поэтому вам необходимо перезагрузить UITableView с помощью:

self.tableView.reloadData()

После цикла for.Потому что это асинхронный вызов, в котором вам нужно подождать, пока вы не получите данные с сервера.

И ваш код будет выглядеть так:

override func viewDidLoad() {
    super.viewDidLoad()

    let reviewTopic = Firestore.firestore().collection("usersIds").document(userEmail!).collection("reviews")
    reviewTopic.getDocuments() {
        (QuerySnapshot,err) in

        if let err = err {
            print("Error getting documents: \(err)");
        } else {
            for document in QuerySnapshot!.documents {
                self.count += 1
                print("\(document.documentID) => \(document.data())");
            }
            print("Count = \(self.count)"); 
            self.tableView.reloadData()
        }
        print("Count from viewDidLoad: ", self.count) // prints 2
    }
}

Еще одна вещь, которую вы должны создать объект классаи сохраните все данные в объекте класса, а затем получите доступ к этим данным в вашем методе cellforrow и numberofrows.Или вы можете использовать протокол Codable для анализа вашего JSON с сервера и сохранения данных сервера.

И с этим вы можете легко управлять своим источником данных UITableView, а также узнавать, какая ячейка нажаталегко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...