2016-11-08 2 views
2

У моего приложения есть UITableViewController, который использует FirebaseTableViewDataSource (из FirebaseUI). В таблице показаны закладками сообщений пользователя правильно, но когда я вхожу, что пользователь выключен, и войти другой пользователь в, то приложении падает со следующим сообщением:Авария FirebaseTableViewDataSource при выводе пользователя и подписании

* Нагрузочным приложение из-за неперехваченное исключение «NSInternalInconsistencyException», почему-то : «Неверное обновление: недопустимое количество строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк, содержащихся в этом разделе, перед обновлением (2), плюс или минус количество вставленных или удаленных строк из этой секции (1 вставлено, 0 удалено) и плюс или минус количество строк, перемещенных в или из этой секции (0 перемещено, 0 перемещено). '*

Я подозреваю, что проблема связана с тем, как FirebaseUI обновляет содержимое таблицыView. Я отлаживаю это за последние 4 дня; искали вопросы SO; прочитайте соответствующие документы, но никто не упоминает эту уникальную проблему. Любая помощь будет высоко ценится.

ПОДРОБНО.Подробнее (К сожалению, это на самом деле долго)

Это моя структура базы данных:

| 
+-posts 
| | 
| +-$postid 
|  | 
|  +-/* properties of a post: title, text, etc */ 
| 
+-users 
    | 
    +-$userid 
     | 
     +-bookmarks 
      | 
      +-post1: true 
      | 
      +-post2: true 

Я использую FirebaseUI, чтобы показать пользователю его/ее закладки, передавая users/$userid/bookmarks реф в FirebaseTableViewDataSource как запрос. Тогда для каждого ключа, я наблюдаю одно событие значения на posts/$postid для того, чтобы восстановить почтовые реквизиты ... код ниже:

self.authStateListenerHandle = FIRAuth.auth()?.addStateDidChangeListener { auth, user in 

    guard let user = user else { 
     return 
    } 

    self.query = FIRDatabase.database().reference().child("users").child(user.uid).child("bookmarks") 

    self.tableViewDataSource = FirebaseTableViewDataSource(query: self.query!, view: self.tableView, populateCell: { (tableView, indexPath, snapshot) -> UITableViewCell in 

     if snapshot.exists() { 

      let postRef = FIRDatabase.database().reference().child("posts").child(snapshot.key) 

      let cell = tableView.dequeueReusableCell(withIdentifier: BookmarksVC.reuseIdentifier, for: indexPath) as! MiniTableCell 

      postRef.observeSingleEvent(of: .value, with: { (snapshot) in 
       if snapshot.exists() { 
        let post = Event(snapshot: snapshot)! 
        let postVM = EventViewModel(post: post) 
        cell.populateCellWithEvent(postVM) 
        cell.delegate = self 
       } 
      }) 

      return cell 
     } 
     else { 
      return UITableViewCell() 
     } 
    }) 

    self.tableView.dataSource = self.tableViewDataSource 
} 

я поставил выше код в viewDidAppear, а затем удалить authStateListenerHandle в viewWillDisappear как так

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    if let handle = self.authStateListenerHandle { 
     FIRAuth.auth()?.removeStateDidChangeListener(handle) 
    } 
} 

Почти все отлично, за исключением работ, когда я просматривать закладки для пользователя, а затем выйти и снова войти в систему, сбои приложений с сообщением

* Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Неверное обновление: недопустимое количество строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк содержащиеся в этом разделе перед обновлением (2) плюс или минус количество строк, вставленных или удаленных из этого раздела (1 вставлено, 0 удалено) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено в , 0 выехал). *

+1

В 'viewWillDisappear' установите' tableView.dataSource = nil'. Таким образом, вы не обновляете dataSource неправильно. –

+0

@Frank, спасибо большое! Установка 'tableView.dataSource = nil' остановила сбой. Тем не менее, это привело к еще одной проблеме, приложение теперь сбой, когда я делаю следующее: перейдите в закладку vC, перейдите к другому VC, затем добавьте дочерний элемент в узел закладок пользователя вручную в консоли Firebase. Сообщение - это что-то о «вставке 1 строки в раздел 0 с помощью 0 строк ...». В любом случае, я решил проблему, установив 'self.tableViewDataSource = nil' (потому что это то, что я сам.tableView.dataSource в конечном итоге получает значение). Все работает правильно. – eyeezzi

+0

@ Фрэнк, не могли бы вы пролить свет на то, почему я впервые столкнулся с крахом? Я знаю, что 'tableView.dataSource = nil' очищает источник данных для чистого запуска, но разве это не должно быть сделано FirebaseUI? – eyeezzi

ответ

0

В viewWillDisappear установить self.tableViewDataSource = nil. Итак, вы не обновляете dataSource неправильно.

Смежные вопросы