gpt4 book ai didi

swift - 分组的 UITableView 和 Realm 通知

转载 作者:搜寻专家 更新时间:2023-11-01 07:06:47 27 4
gpt4 key购买 nike

我有一个包含两个部分的 UITableView。每个部分显示查询特定 Realm 对象的结果。

var contentRequests: Results<UESocketPostRequest>? {
return try? CustomRealm.realm().objects(UESocketPostRequest.self).filter("completed = false AND content != nil").sorted(byKeyPath: "content.createdAt", ascending: false)
}

var mediaUploads: Results<UEMediaUploadRequest>? {
return try? CustomRealm.realm().objects(UEMediaUploadRequest.self).filter("finished = false").sorted(byKeyPath: "media.content.createdAt", ascending: false)
}

我的 UITableViewDelegateUITableViewDataSource 一致性:

func numberOfSections(in tableView: UITableView) -> Int {
return 2
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch section {
case 0:
return self.contentRequests?.count ?? 0
case 1:
return self.mediaUploads?.count ?? 0
default:
return 0
}
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "UPLOADCELL") as? UEUploadCell else {
return UITableViewCell()
}

switch indexPath.section {
case 0:
if let request = self.contentRequests?[indexPath.row] {
cell.softBindSocketRequest(request)
}
case 1:
if let request = self.mediaUploads?[indexPath.row] {
cell.softBindMediaUploadRequest(request)
}
default:
break
}

return cell
}

然后我为我的每个 Realm 结果设置 NotificationToken,并像这样更新 TableView :

func startContentToken() {
self.contentToken = self.contentRequests?.observe({ [weak self] (changes) in
switch changes {
case .error:
break
case .initial:
let indexSet = IndexSet(integer: 0)
self?.tableView.reloadSections(indexSet, with: .automatic)
case .update(let content, deletions: let deletions, insertions: let insertions, modifications: let modifications):
self?.tableView.beginUpdates()
self?.tableView.insertRows(at: insertions.map({ IndexPath(row: $0, section: 0) }),
with: .automatic)
self?.tableView.deleteRows(at: deletions.map({ IndexPath(row: $0, section: 0)}),
with: .automatic)
self?.tableView.reloadRows(at: modifications.map({ IndexPath(row: $0, section: 0) }),
with: .automatic)
self?.tableView.endUpdates()
}
})
}

func startMediaToken() {
self.mediaToken = self.mediaUploads?.observe({ [weak self] (changes) in
switch changes {
case .error:
break
case .initial:
let indexSet = IndexSet(integer: 1)
self?.tableView.reloadSections(indexSet, with: .automatic)
case .update(let media, deletions: let deletions, insertions: let insertions, modifications: let modifications):
self?.tableView.beginUpdates()
self?.tableView.insertRows(at: insertions.map({ IndexPath(row: $0, section: 1) }),
with: .automatic)
self?.tableView.deleteRows(at: deletions.map({ IndexPath(row: $0, section: 1)}),
with: .automatic)
self?.tableView.reloadRows(at: modifications.map({ IndexPath(row: $0, section: 1) }),
with: .automatic)
self?.tableView.endUpdates()
}
})
}

由于此日志消息或类似内容封装的 UITableView 不一致异常,我经常崩溃:

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 1 部分中的行数无效。更新 (4) 后现有部分中包含的行数必须为等于更新前该部分中包含的行数 (0),加上或减去从该部分插入或删除的行数(0 插入,0 删除)加上或减去移入或移出的行数该部分(0 个移入,0 个移出)。

是我做错了什么,还是 Realm 不是为以这种方式与分组的 UITableView 一起使用而设计的?

最佳答案

您需要做的是为每个部分维护一个手动计数。当您在 Realm 通知 block 中收到插入或删除时更新计数。在 numberOfRowsInSection 中返回计数。更多信息在这里:Updating UITableView with multiple sections from RLMResults.Observe()

关于swift - 分组的 UITableView 和 Realm 通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47521455/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com