iOS - 托管对象上下文异常

时间:2016-12-13 10:58:34

标签: ios exception breakpoints nsmanagedobjectcontext

当我启用异常断点时,我得到了以下代码的异常。

我不知道为什么,但每次启动App都会触发断点。

是否有一些我不了解的异常断点或者我应该调查托管对象上下文?

编辑:

代码示例:

-(void)parseJson
{
    _resultArray = [[NSMutableArray alloc]init];
    BOOL success = YES;
    NSError *saveError = nil;

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeCoreDataChangesToMainContext:) name:NSManagedObjectContextDidSaveNotification object:self.managedObjectContext];

    [self doCustomActionBeforeParsing];
    for (NSDictionary* entries in _jsonArray) {
        id aMTLObject = [[MTLDatabaseManager sharedInstance] mantleObjectModel:_modelClass anItem:entries];
        [self doCustomActionBeforeCoreDataInsertionOfMantleObject:aMTLObject];
        [[MTLDatabaseManager sharedInstance] insertMantleObjectInContext:aMTLObject aManagedObjectContext:self.managedObjectContext];
        if ([self isCancelled])
            break;
    }

    if (![self isCancelled] && [self.managedObjectContext hasChanges]) {
        [self.managedObjectContext performBlockAndWait:^{
            success = [self.managedObjectContext save:&saveError];
        }];
    }

    if (![self isCancelled]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if (success) {
                [self.delegate parserDidFinishParsingOperation:self fromUrl:self.dataUrl];
            } else {
                [self.delegate parserOperation:self didFailParsingOperationWithError:saveError fromUrl:self.dataUrl];
            }
        });
    }

    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:self.managedObjectContext];
}

这是使用performAndWait块吗?

异常断点在此行触发:

success = [self.managedObjectContext save:&saveError];

我在这篇文章中看到,我们可以忽略某些例外情况。 ignore exception

忽略CoreData异常是一种好习惯吗? (我猜不是)。

1 个答案:

答案 0 :(得分:1)

尝试包装

Name: 'Patient',
Values: [
    { ID: 2, Name: 'Add' },
    { ID: 3, Name: 'Edit' },
]

可能会发生什么,

您可能正在访问managedObjects,或者可能正在调用managedObjectContext save,该线程可能属于与self.managedObjectContext关联的队列不同的队列。

iOS 5以后,当您使用MainQueue并发或ProvateQueue并发模型时,您可以使用ManagedObjectContext的perform或performAndWait来确保只有属于与managedObject相同的队列的线程才能访问托管对象上下文上下文是相关联的。