 		}
 
 		if let deletedObjects = userInfo[NSDeletedObjectsKey] as? Set<NSManagedObject> {
-			processDeletedObjects(deletedObjects)
+			processDeletedObjects(deletedObjects,
+			                      deleted: &deletedIndexPaths,
+			                      cacheClearing: &cacheClearingIds)
 		}
 
 		if let invalidatedObjects = userInfo[NSInvalidatedObjectsKey] as? Set<NSManagedObject> {
-			processDeletedObjects(invalidatedObjects)
+			processDeletedObjects(invalidatedObjects,
+			                      deleted: &deletedIndexPaths,
+			                      cacheClearing: &cacheClearingIds)
 		}
 
 		if let updatedObjects = userInfo[NSUpdatedObjectsKey] as? Set<NSManagedObject> {
-			processUpdatedObjects(updatedObjects)
+			processUpdatedObjects(updatedObjects,
+			                      inserted: &insertedIds,
+			                      updated: &updatedIds,
+			                      sortOrderAffecting: &sortOrderAffectingIndexPaths,
+			                      sectionChanged: &sectionChangedIndexPaths,
+			                      deleted: &deletedIndexPaths,
+			                      cacheClearing: &cacheClearingIds)
 		}
 
 		if let refreshedObjects = userInfo[NSRefreshedObjectsKey] as? Set<NSManagedObject> {
-			processUpdatedObjects(refreshedObjects)
-		}
-
-		if let changes = mergeChanges(inserted: insertedObjects,
-																  deleted: deletedObjects,
-																  updated: updatedObjects,
-																  sortOrderAffecting: sortOrderAffectingObjects,
-																  sectionChanged: sectionChangedObjects) {
+			processUpdatedObjects(refreshedObjects,
+			                      inserted: &insertedIds,
+			                      updated: &updatedIds,
+			                      sortOrderAffecting: &sortOrderAffectingIndexPaths,
+			                      sectionChanged: &sectionChangedIndexPaths,
+			                      deleted: &deletedIndexPaths,
+			                      cacheClearing: &cacheClearingIds)
+		}
+
+		for id in cacheClearingIds {
+			clearCache(for: id)
+		}
+
+		if let changes = mergeChanges(inserted: insertedIds,
+																  deleted: deletedIndexPaths,
+																  updated: updatedIds,
+																  sortOrderAffecting: sortOrderAffectingIndexPaths,
+																  sectionChanged: sectionChangedIndexPaths) {
 			eventObserver.sendNext(.updated(changes))
 		}
 	}

		return nil
	}

	/// Merge changes since last posting of NSManagedContextObjectsDidChangeNotification.
	/// This method should not mutate the `sections` array.
	@objc private func process(objectsDidChangeNotification notification: NSNotification) {

		}

		/// Reference sections by name, since these objects may lead to creating a new section.
		var insertedIds = [ReactiveSetSectionName: Set<NSManagedObjectID>]()

		/// Referencing sections by the index in snapshot.
		var sectionChangedIndexPaths = sections.indices.map { _ in Set<Int>() }
		var deletedIndexPaths = sections.indices.map { _ in [Int]() }
		var updatedIds = sections.indices.map { _ in Set<NSManagedObjectID>() }
		var sortOrderAffectingIndexPaths = sections.indices.map { _ in Set<Int>() }
		var cacheClearingIds = ContiguousArray<NSManagedObjectID>()

		if let _insertedObjects = userInfo[NSInsertedObjectsKey] as? Set<NSManagedObject> {
			for object in _insertedObjects {
				if let object = qualifyingObject(object) {
					let name = _sectionName(of: object)
					insertedIds.insert(object.objectID, intoSetOf: name)
					updateCache(for: object.objectID, with: object)

					if object.objectID.temporaryID {
