繁体   English   中英

奇怪的核心数据行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM