[英]Strange Core-Data behaviour
我使用NSBlockOperation
执行一些工作,在此块中,持久性存储丢失了其持久性存储。
以下代码:
- (void) eraseCoreData_ManagedObjectsInArray:(NSArray *) arrayOfManagedObjectsToDelete usingManagedContext:(NSManagedObjectContext *) managedObjectContext
{
NSLog(@"Managed object context is %@", managedObjectContext);
NSLog(@"----->Persistent store of the deletion context has %d stores", [managedObjectContext.persistentStoreCoordinator.persistentStores count]);
// add the operation to the queue with a block
[self.coreDataDeletionQueue addOperationWithBlock:^{
for (NSManagedObject *objectToDelete in arrayOfManagedObjectsToDelete) {
[managedObjectContext deleteObject:objectToDelete];
}
NSLog(@"Managed object context in operation block is %@", managedObjectContext);
NSLog(@"Persistence store coordinator in operation block is %@", managedObjectContext.persistentStoreCoordinator);
NSLog(@"Persistent store of the deletion context in operation block has %d stores", [managedObjectContext.persistentStoreCoordinator.persistentStores count]);
NSError *saveError = nil;
if (![managedObjectContext save:&saveError]) {
NSLog(@"Couldn't save Core-Data state for the deleted objects result: %@", [saveError localizedDescription]);
}
}];
}
将此注销:
受管对象上下文为<NSManagedObjectContext:0xa46ff10>
----->删除上下文的持久存储区有1个存储区
操作块中的托管对象上下文为<NSManagedObjectContext:0xa46ff10>
操作块中的持久性存储协调器为<NSPersistentStoreCoordinator:0xa1a45e0>
删除上下文在操作块中的永久存储有0个存储
*由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“此NSPersistentStoreCoordinator没有持久存储。 它无法执行保存操作。
我不确定为什么突然丢失存储,是否可能是由于它运行在我设置为使用内存中存储的测试套件中,并且该执行块不与该NSOperationQueue
共享内存?
我猜您使用的是错误的代码。
首先,每个线程必须具有自己的上下文。 因此,在块操作内部,您需要创建一个新上下文并在该块中使用它。
NSManagedObjectContext *blockContext = [[NSManagedObjectContext alloc] init];
[blockContext setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]];
然后,如果需要在上下文中共享对象,请使用NSManagedObjectID
而不是NSManagedObject
。 在创建该块之前,请保存主上下文,否则您将只有临时ID。 否则请使用- (BOOL)obtainPermanentIDsForObjects:(NSArray *)objects error:(NSError **)error
来获取永久性ID而无需保存。
NSArray *objectIDs = [arrayOfManagedObjectsToDelete valueForKey:@"objectID"];
在块内使用- (NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID error:(NSError **)error
可以通过blockContext
检索您感兴趣的对象。
您的代码可能看起来像
NSArray *objectIDs = [arrayOfManagedObjectsToDelete valueForKey:@"objectID"];
// add the operation to the queue with a block
[self.coreDataDeletionQueue addOperationWithBlock:^{
NSManagedObjectContext *blockContext = [[NSManagedObjectContext alloc] init];
[blockContext setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]];
NSError* error = nil;
for (NSManagedObject *objectID in objectIDs) {
// some error handling here...
NSManagedObject* objectToDelete = [existingObjectWithID:objectID error:&error];
[blockContext deleteObject:objectToDelete];
}
if (![blockContext save:&error]) {
NSLog(@"Couldn't save Core-Data state for the deleted objects result: %@", [error localizedDescription]);
}
}];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.