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

时间:2011-01-21 11:10:05

标签: objective-c multithreading core-data

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

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

P.S。一些注意事项 - 如果我不保存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 CoreFoundation 0x00007fff885317b4 __exceptionPreprocess + 180     1 libobjc.A.dylib 0x00007fff88bc10f3 objc_exception_throw + 45     2 CoreData 0x00007fff8005a654 - [NSManagedObjectContext(_NSInternalChangeProcessing)_prepareForPushChanges:] + 244     3 CoreData 0x00007fff8005a0af - [NSManagedObjectContext save:] + 207     4 snow 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 个答案:

答案 0 :(得分:0)

根据错误,您在某处的验证方法中做了一些不好的事情。

  • 您是否拥有托管对象的子类?
  • 这些子类中是否有验证方法?
  • 这些验证方法是否触及其他托管对象或删除不应在验证方法中完成的对象或其他内容?

先检查一下,发布您拥有的任何验证码,然后有人可以帮您解决此问题。