Skip to content

Instantly share code, notes, and snippets.

@yccheok
Created December 10, 2023 18:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yccheok/d287fc6e67fad73800504a545cfebf8f to your computer and use it in GitHub Desktop.
Save yccheok/d287fc6e67fad73800504a545cfebf8f to your computer and use it in GitHub Desktop.
Update "order" column using NSManagedObject
private func _updateOrdersIfPossible(context: NSManagedObjectContext, updateOrders: [UpdateOrder]) {
let count = updateOrders.count
if count < 2 {
return
}
var prevOrder = updateOrders[0].order
var updatedObjectIDs = [NSManagedObjectID]()
if !Utils.isValidOrder(prevOrder) {
prevOrder = prevOrder - 1
precondition(Utils.isValidOrder(prevOrder))
// Time-consuming operation.
if let nsPlainNote = NSPlainNoteRepository.getNSPlainNote(context: context, objectID: updateOrders[0].objectID, propertiesToFetch: ["order"]) {
nsPlainNote.order = prevOrder
}
}
for index in 1..<count {
precondition(Utils.isValidOrder(prevOrder))
let updateOrder = updateOrders[index]
if !Utils.isValidOrder(updateOrder.order) || updateOrder.order <= prevOrder {
var newOrder = prevOrder + 1
if !Utils.isValidOrder(newOrder) {
newOrder = newOrder + 1
}
precondition(newOrder > prevOrder)
prevOrder = newOrder
precondition(Utils.isValidOrder(newOrder))
// Time-consuming operation.
if let nsPlainNote = NSPlainNoteRepository.getNSPlainNote(context: context, objectID: updateOrder.objectID, propertiesToFetch: ["order"]) {
nsPlainNote.order = newOrder
}
} else {
// Skip from updating. Fast!
prevOrder = updateOrder.order
}
} // for index in 1..<count
RepositoryUtils.saveContextIfPossible(context)
}
static func getNSPlainNote(context: NSManagedObjectContext, objectID: NSManagedObjectID, propertiesToFetch: [Any]?) -> NSPlainNote? {
var nsPlainNote: NSPlainNote? = nil
context.performAndWait {
let fetchRequest = NSPlainNote.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "self = %@", objectID)
fetchRequest.propertiesToFetch = propertiesToFetch
fetchRequest.fetchLimit = 1
do {
let nsPlainNotes = try fetchRequest.execute()
if let _nsPlainNote = nsPlainNotes.first {
nsPlainNote = _nsPlainNote
}
} catch {
error_log(error)
}
}
return nsPlainNote
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment