- (NSDictionary *) generateChangeSetsForSection:(NSString *) section withNewObjects:(NSOrderedSet *) newObjects fromOldObjects:(NSOrderedSet *) oldObjects { NSSet *newObjectsSet = [newObjects set]; NSSet *previousObjectsSet = [oldObjects set]; NSMutableSet *insertedObjects = [newObjectsSet mutableCopy]; [insertedObjects minusSet:previousObjectsSet]; NSMutableSet *deletedObjects = [previousObjectsSet mutableCopy]; [deletedObjects minusSet:newObjectsSet]; NSMutableSet *updatedObjects = [newObjectsSet mutableCopy]; [updatedObjects minusSet:insertedObjects]; [updatedObjects minusSet:deletedObjects]; NSMutableSet *changes = [NSMutableSet set]; for (id object in insertedObjects) { [changes addObject:@{kTCTableUpdateType: @(NSFetchedResultsChangeInsert), kTCTableUpdateNewIndex: @([newObjects indexOfObject:object])}]; } for (id object in deletedObjects) { [changes addObject:@{kTCTableUpdateType: @(NSFetchedResultsChangeDelete), kTCTableUpdateOldIndex: @([oldObjects indexOfObject:object])}]; } for (id object in updatedObjects) { [changes addObject:@{kTCTableUpdateType: @(NSFetchedResultsChangeMove), kTCTableUpdateOldIndex: @([oldObjects indexOfObject:object]), kTCTableUpdateNewIndex: @([newObjects indexOfObject:object])}]; } return @{kTCTableUpdateSection: section, kTCTableUpdateChanges: [changes copy]}; }