UICollectionView выполняет пакетные обновления сбоев с уведомлением области - PullRequest
0 голосов
/ 18 декабря 2018

Я использую Realm Swift для своего приложения обмена сообщениями.Моим базовым представлением для обмена сообщениями является пользовательский UICollectionView, и я использую realm swift для хранения данных.К сожалению, я не смог найти ни одного официального примера из области обновления представления коллекции с помощью уведомления области.Поэтому я реализовал это так, когда получаю сообщения из области, получающие messagesToken , добавляя наблюдателя для этого списка областей, поэтому, когда обновление поступает из этого уведомления, я выполняю пакетные обновления и удаляю, вставляю и изменяю индексы, которые мне сказала областьсделать в этом уведомлении.мое приложение хорошо работает в тестовой среде, но в производственной среде я получил несколько сбоев, в которых сообщалось о том, что мое приложение сообщило мне о сбое приложения, и оно вызвано этими пакетными обновлениями.их сообщения в основном похожи на

invalid update: invalid number of sections. The number of sections contained in the collection view after the update (1) must be equal to the number of sections contained in the collection view before the update (1), plus or minus the number of sections inserted or deleted (0 inserted, 1 deleted).  

или недопустимое количество элементов в разделе после обновления и так далее.Я так растерялся сейчас.Есть идеи?

Мой код для этого обновления

notificationToken = dbmsgs?.observe { [weak self] (changes: RealmCollectionChange) in
  switch changes{
  case .initial:
    print("intial")
    self?.collectionView.reloadData()
  case .update(_,let deletions,let insertions,let modifications):
    self?.collectionView.performBatchUpdates({
      if deletions.count > 0{
        print("deletions count\(deletions.count)")
        if (self?.collectionView.numberOfItems(inSection: 0) ?? 0) - deletions.count > 0 {
          self?.collectionView.deleteItems(at: deletions.map { IndexPath(row: $0, section: 0) })
        }
        else{
          self?.collectionView.deleteSections(IndexSet(integer: 0))
        }
      }
      if insertions.count > 0{
        print("insertaions count\(insertions.count)")
        for index in insertions{
          guard let lastdbmsg = self?.dbmsgs?[index] else{
            return
          }
          let sectionIndex = 0
          let itemIndex = ( self?.dbmsgs != nil) ? (self?.dbmsgs?.count)! - 1 : 0
          if itemIndex == 0{
            self?.collectionView.insertSections([0])
          }
          self?.collectionView.insertItems(at: [IndexPath(item: itemIndex, section: sectionIndex)])
          if itemIndex != 0{
            self?.collectionView.reloadItems(at: [IndexPath(row: itemIndex-1, section: 0)])
          }

        }
      }
      if modifications.count > 0{
        self?.collectionView.reloadItems(at: modifications.map({ IndexPath(row: $0, section: 0)}))
      }
    },completion: { (_) in
    })
  case .error(let error):
    // An error occurred while opening the Realm file on the background worker thread
    fatalError("\(error)")
  }
}
...