Forked from AndrewBennet/ManagedObjectDeletionFiringFault.swift
Created
March 5, 2018 23:20
-
-
Save atomicbird/56e1b3852656541dd9b8ded99bb93445 to your computer and use it in GitHub Desktop.
A Swift playground demonstrating that deleting an NSManagedObject causes a fault to fire
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import CoreData | |
import PlaygroundSupport | |
// Build a simple model in code for demo purposes. | |
// The model has a single entity called "Entity" with a single optional string attribute called "testAttribute". | |
// There are no relationships in the model. | |
let model = NSManagedObjectModel() | |
let entity = NSEntityDescription() | |
entity.name = "Entity" | |
let testAttribute = NSAttributeDescription() | |
testAttribute.name = "testAttribute" | |
testAttribute.attributeType = .stringAttributeType | |
testAttribute.isOptional = true | |
entity.properties = [testAttribute] | |
model.entities = [entity] | |
print("Model: \(model)") | |
let container = NSPersistentContainer(name: "TestModel", managedObjectModel: model) | |
container.loadPersistentStores{ _,_ in | |
// Create a new entity, save the model and reset the context | |
let context = container.viewContext | |
let entity = NSEntityDescription.insertNewObject(forEntityName: "Entity", into: context) | |
entity.setValue("test", forKey: "testAttribute") | |
try! context.save() | |
context.reset() | |
// Now try to fetch the existing entity. We want to delete it without firing the fault | |
let f = NSFetchRequest<NSManagedObject>(entityName: "Entity") | |
f.includesPropertyValues = false | |
f.fetchLimit = 1 | |
// Get the first result from the fetch. This will be a fault | |
let firstEntity = try! context.fetch(f).first! | |
print("Entity is fault: \(firstEntity.isFault)") | |
// Delete the object. It will no longer be a fault | |
context.delete(firstEntity) | |
print("Entity is fault: \(firstEntity.isFault)") | |
} | |
PlaygroundPage.current.needsIndefiniteExecution = true |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment