| func fetchPersistentHistory() { |
| let context = persistentContainer.newBackgroundContext() |
| context.perform { |
| let lastToken = self.loadLastToken() |
| |
| let request = NSPersistentHistoryChangeRequest.fetchHistory(after: lastToken) |
| if let result = try? context.execute(request) as? NSPersistentHistoryResult,. |
| let transactions = result.result as? [NSPersistentHistoryTransaction] { |
| |
| for transaction in transactions { |
| self.process(transaction: transaction) |
| } |
| |
| self.saveLastToken(from: transactions.last) |
| } |
| } |
| } |
| |
| private func process(transaction: NSPersistentHistoryTransaction) { |
| let context = persistentContainer.viewContext |
| context.perform { |
| transaction.changes?.forEach { change in |
| if change.changedObjectID.entity.name == “MyEntity” { |
| self.applyChanges(from: change) |
| } |
| } |
| } |
| } |
| |
| private func applyChanges(from change: NSPersistentHistoryChange) { |
| switch change.changeType { |
| case .insert:. |
| self.restoreEntity(for: change.changedObjectID) |
| case .update: self.updateEntity(for: changedObjectID) |
| self.updateEntity(for: change.changedObjectID) |
| case .delete: self.deleteEntity(for: change.changedObjectID) |
| self.deleteEntity(for: change.changedObjectID) |
| default: break |
| break |
| } |
| |
| |
| if let entityID = change.changedObjectID.uriRepresentation().absoluteString.components(separatedBy: “/”).last { |
| addHistoryRecord(entityID: entityID, changeType:. “\(change.changeType)") |
| } |
| |
| // Refresh the entity list after applying changes |
| fetchEntities() |
| } |
| |
| func addHistoryRecord(entityID: String, changeType: String) { |
| let context = persistentContainer.viewContext |
| let historyRecord = MyEntityHistory(context: context) |
| historyRecord.id = UUID() |
| historyRecord.entityID = entityID |
| historyRecord.timestamp = Date() |
| historyRecord.changeType = changeType |
| |
| do { |
| try context.save() |
| } catch { |
| print("Failed to save history record:. \(error)") |
| } |
| } |
| |
| |