Mac OS 应用程序在保存太多新的 NSManagedObject 时崩溃



我正在尝试编写一个应用程序,该应用程序枚举拖到主应用程序窗口上的文件夹和项目,然后将它找到的每个PDF放入我的核心数据数据库中,进而填充NSTableView。长话短说,我已经到了可以安全地将一些项目拖到窗口中并保存数据库的阶段,从而允许我一次又一次地重新启动应用程序。

我遇到的问题是,如果我[说]将我的文档文件夹拖到窗口上,它似乎都可以正常工作,但是当我退出并尝试重新启动时,它会崩溃并显示

Thread 1: EXC_BAD_ACCESS (code=2, address-0x7fff6f11dff8

我目前正在使用的代码(专门为调试此问题而编写)是:

    NSError *error;
    id firstObject = [draggedStuff objectAtIndex:0];
    NSDictionary *fileAttribs = [[NSFileManager defaultManager] attributesOfItemAtPath:firstObject error:&error];
    if ([[fileAttribs valueForKey:NSFileType] isEqualTo:NSFileTypeDirectory]) {
        NSManagedObject *aNewFolder = [[NSManagedObject alloc]initWithEntity:[NSEntityDescription entityForName:kFOLDERS_ENTITY inManagedObjectContext:[self managedObjectContext]] insertIntoManagedObjectContext:[self managedObjectContext]];
        [aNewFolder setValue:firstObject forKey:kFOLDER_PATH];
        NSArray *directoryContents = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:firstObject error:&error];
        assert(!error);
        [directoryContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            CFStringRef fileExtension = (__bridge CFStringRef) [obj pathExtension];
            CFStringRef fileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, NULL);
            if (UTTypeConformsTo(fileUTI, kUTTypePDF)) {
                NSManagedObject *aDocument = [[NSManagedObject alloc]initWithEntity [NSEntityDescription entityForName:kDOCO_ENTITY inManagedObjectContext:[self managedObjectContext]] insertIntoManagedObjectContext:[self managedObjectContext]];
                [aNewPicture setValue:obj forKey:@"docoPath"];
            }
            CFRelease(fileUTI);
            if (idx % 20 == 0) {
                NSError *error;
                [[self managedObjectContext] save:&error];
                assert(!error);
            }
        }];
    }

最初,我在 NSOperation 子类中使用它,并检查用户取消的相关内容,但我已将其移动到主线程只是为了确保它与此无关,所以,是的,它目前不是一个用户友好的代码段。

崩溃肯定与directoryContents返回的项目数量有关,因为如果我拖动一个只有 20 个左右项目的文件夹,它绝对可以正常工作。如果directoryContents保存大约 200 个文件或更多,那么 Core Data 似乎无法正确保存它并损坏需要在重新启动应用程序之前进行垃圾处理的 storedata 文件。

可以更改if (idx % 20 == 0)...以保存或多或少等待保存的 NSManagedObjects,但结果也相同。

我也尝试使用NSDirectoryEnumerator,结果相同:损坏始终与文件夹中的项目数有关。

我喜欢核心数据,但有时我会迷失方向,所以非常感谢任何帮助,特别是考虑到这篇文章的长度!

托德。

事实证明,它比我想象的要简单得多:我设法错误地连接了我的 NSTable。

我已经将 NIB 中的表视图和表列都连接到实体......哎呀。

最新更新