因此,我将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/