在一个简单的TableViewController中,我在UIAlertController中调用ClouKit deleteRecord。
// 2. When the user clicks OK.
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak alert] (_) in
LSCloudKit.shared.deleteRecord(record: login.toCKRecord(), completion: { (success) in
let index = self.logins.index(of: login);
self.logins.remove(at: index!);
self.tableView.reloadData(); // <-problem is here. Data not displayed properly
});
}));
当我调用self.tableView.reloadData()时,表似乎更新但它显示错误的列表,即:相同单元格的两倍,有时是删除的单词,有时是另一单元格。
我检查了主要线程上的调用。 这也是deleteRecord函数:
func deleteRecord(record: CKRecord!, completion: @escaping (Bool) -> ()) {
let container = CKContainer.default();
let privateDatabase = container.privateCloudDatabase;
privateDatabase.delete(withRecordID: record.recordID) { (recordID, error) in
DispatchQueue.main.async {
completion(error == nil)
}
}
}
如果我在xCode中的DispatchQueue.main.async内部或“deleteRecord”的完成块内放置断点,那么一旦我点击“继续”,设备上的一切就会正常显示。
问题也发生在模拟器和真实设备上。
请帮忙。
谢谢。
编辑:添加屏幕截图
以下是从列表中删除“user1”之前和之后的屏幕截图,其中包含输出:
删除前的self.logins:[admin,master,user1,user2,user3]
删除后的self.logins:[admin,master,user2,user3]
答案 0 :(得分:0)
通过使用this而不是reloadData()
,我能够解决这个问题 self.tableView.beginUpdates()
self.tableView.deleteRows(at: [IndexPath.init(row: index!, section: 0)], with: .automatic)
self.tableView.endUpdates()
我暂时不会将此标记为正确的答案,因为它是一个解决方法,我仍然不明白为什么reloadData()不起作用。它很讨厌我。