因此,我将Realm用作数据存储,我敢肯定我需要先添加内容,然后才能在集合视图的索引路径处插入项目。但是我一直收到这个太熟悉的错误:
'NSInternalInconsistencyException', reason: 'attempt to insert item 1 into section -1, but there are only 1 items in section 1 after the update'
这是我的模型:

final class Listing: Object {
dynamic var id = ""
dynamic var name = ""
dynamic var item = ""

}

这是我的符合UICollectionView数据源和委托的视图控制器:
 override func viewDidLoad() {
    super.viewDidLoad()

    // MARK: - Get Listings!

    queryListings()

    // MARK: - Delegates

    self.collectionView.delegate = self
    self.collectionView.dataSource = self
}

// MARK: - Query Listings

func queryListings() {
    let realm = try! Realm()

    let everyListing = realm.objects(Listing.self)
    let listingDates = everyArticle.sorted(byKeyPath: "created", ascending: false)

    for listing in listingDates {
        listing.append(listing)
        self.collectionView.performBatchUpdates({
            self.collectionView.insertItems(at: [IndexPath(item: self.listing.count, section: 1)])
        }, completion: nil)
    }
}

代表们:
 // MARK: UICollectionViewDataSource

 func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return listing.count
}

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! ListingCollectionViewCell

    cell.awakeFromNib()

    return cell
}

我已经尝试过self.listing.count 0、1,-1,+ 1以及部分0、1,-1,+ 1的每个排列,并且引发的异常是相同的正负号,即存在的部分和项。调用reloadData()也无济于事。

有人用集合视图解决这个问题吗?

最佳答案

代码行for listing in listingDates { listing.append(listing) }似乎有点不安全。您所指的是名为listing的单独对象(例如class属性),或者是指相同的listing对象。如果清单是Realm的Results对象,则不应在其上调用append

无论如何,您可能要做的工作比您需要做的要多。领域对象(无论它们是Object还是Results)都是 Activity 的,因为如果基础数据对其进行更改,它们将自动更新。这样,就不必执行多个查询来更新集合视图。

最佳实践是执行一次查询,然后将Results对象保存为视图控制器的属性。从那时起,您可以使用Realm's Change Notification功能分配一个Swift闭包,该闭包将在Realm查询每次更改时执行。然后,可以使用它来对集合视图上的更新进行动画处理:

class ViewController: UITableViewController {
  var notificationToken: NotificationToken? = nil

  override func viewDidLoad() {
    super.viewDidLoad()
    let realm = try! Realm()
    let results = realm.objects(Person.self).filter("age > 5")

    // Observe Results Notifications
    notificationToken = results.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in
      guard let tableView = self?.tableView else { return }
      switch changes {
      case .initial:
        // Results are now populated and can be accessed without blocking the UI
        tableView.reloadData()
        break
      case .update(_, let deletions, let insertions, let modifications):
        // Query results have changed, so apply them to the UITableView
        tableView.beginUpdates()
        tableView.insertRows(at: insertions.map({ IndexPath(row: $0, section: 0) }),
                           with: .automatic)
        tableView.deleteRows(at: deletions.map({ IndexPath(row: $0, section: 0)}),
                           with: .automatic)
        tableView.reloadRows(at: modifications.map({ IndexPath(row: $0, section: 0) }),
                           with: .automatic)
        tableView.endUpdates()
        break
      case .error(let error):
        // An error occurred while opening the Realm file on the background worker thread
        fatalError("\(error)")
        break
      }
    }
  }

  deinit {
    notificationToken?.stop()
  }
}

关于ios - 'NSInternalInconsistencyException'插入带有Collection View 的项目Swift 3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42500504/

10-09 23:11