核心数据删除问题:第二部分

Posted

技术标签:

【中文标题】核心数据删除问题:第二部分【英文标题】:core data delete issues: part two 【发布时间】:2011-01-21 11:10:04 【问题描述】:

亲爱的社区。 Bellow 是代码的一部分,它可以工作,但对我来说有两个问题(代码在 AppDelegate 主线程中工作并从选择对象开始并按下按钮: 1. 有时,我不明白我在哪里看到错误的代码。我不明白,错误(你可以在下面看到)是从哪里开始的,但是如果我里面有数据(SQLLite 文件大约 70Mb)就会发生这种情况。 2. 当删除进程工作时,应用程序开始消耗从 40Mb 到 512Mb 的内存,并在进程完成后保持在同一级别。内存 GC 已启用。

你能提出一些优化它的建议吗?我有疯狂的两周,在那里我检查了谷歌和其他资源并尝试在我的应用程序中组合代码。

附言一些注意事项 - 如果我不保存 moc,我将无法工作,删除数据后立即 bcs 我开始同步并填充相同的数据。如果我不保存,每个实体都有双倍的体积。

2011-01-21 12:54:11.158 snow[14721:9da7] 在保存之前无法处理挂起的更改。 100 次尝试后上下文仍然很脏。通常,这种递归污染是由错误的验证方法、-willSave 或通知处理程序引起的。 2011-01-21 12:54:11.160 snow[14721:9da7] * 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“在保存之前无法处理挂起的更改。 100 次尝试后上下文仍然很脏。通常,这种递归污染是由错误的验证方法、-willSave 或通知处理程序引起的。 * 在第一次抛出时调用堆栈: ( 0 核心基础 0x00007fff885317b4 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x00007fff88bc10f3 objc_exception_throw + 45 2核心数据0x00007fff8005a654-[NSManagedObjectContext(_NSInternalChangeProcessing)_prepareForPushChanges:]+244 3 核心数据 0x00007fff8005a0af -[NSManagedObjectContext 保存:] + 207 4 雪 0x0000000100006fe9 __30-[AppDelegate syncOneCarrier:]_block_invoke_0 + 1657 5 基础 0x00007fff87c4e682 -[NSBlockOperation main] + 157 6 基础 0x00007fff87c3ede4 -[__NSOperationInternal start] + 681 7 基础 0x00007fff87d1dbeb __doStart2 + 97 8 libSystem.B.dylib 0x00007fff85f082c4 _dispatch_call_block_and_release + 15 9 libSystem.B.dylib 0x00007fff85ee6831 _dispatch_worker_thread2 + 239 10 libSystem.B.dylib 0x00007fff85ee6168 _pthread_wqthread + 353 11 libSystem.B.dylib 0x00007fff85ee6005 start_wqthread + 13

    NSUInteger x = 0;
    NSError *error = nil;

    for (NSManagedObject *carrier in [carriersArrayVisible selectedObjects]) 
    
        NSString *carrierName = [NSString stringWithString:[carrier valueForKey:@"name"]];
        [carriersToExecute addObject:carrierName];
        [managedObjectContext deleteObject:carrier];
        //[managedObjectContext processPendingChanges];
        if (x % 10 == 0) 
            //[managedObjectContext save:&error];
            [managedObjectContext processPendingChanges];

            if (error) NSLog(@"Failed to save to data store syncOneCarrier: %@", [error localizedDescription]);
            [pool drain],pool = nil;
            pool = [[NSAutoreleasePool alloc] init];
        
        x++;
    
    [pool drain],pool = nil;

    [managedObjectContext save:&error];

【问题讨论】:

【参考方案1】:

基于错误,您在某处的验证方法中做错了事。

您的托管对象有子类吗? 这些子类中是否有验证方法? 这些验证方法是否涉及其他托管对象或删除对象或其他不应在验证方法中完成的操作?

首先检查那里,发布您拥有的任何验证代码,然后也许有人可以帮助您解决此问题。

【讨论】:

不,我没有。我是,但我从核心数据模型中删除了所有关系。 我不知道你说的关系是什么意思。正在进行一些验证或通知或 -willSave 覆盖导致递归保存。 我的意思是现在我没有任何子类,但错误仍然存​​在。

以上是关于核心数据删除问题:第二部分的主要内容,如果未能解决你的问题,请参考以下文章

C++探索之旅第二部分第一课:面向对象初探,string的惊天内幕

核心数据删除问题:第二部分

实验二 第二部分

实验二 第二部分

实验二 第二部分

核心C#(第二部分)