【发布时间】: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];
【问题讨论】:
标签: objective-c multithreading core-data