保存太多新的NSManagedObjects时,Mac OS App崩溃

时间:2012-06-17 08:37:19

标签: objective-c macos core-data

我正在尝试编写一个应用程序,该应用程序枚举通过拖动到主应用程序窗口的文件夹和项目,然后将它找到的每个PDF的新条目放入我的Core Data数据库,然后再填充NSTableView。简而言之,我已经到了一个阶段,我可以安全地将一些项目拖到窗口中并保存数据库,这样我就可以一次又一次地重启应用程序。

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

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似乎无法正确保存它并破坏需要Trashed的storedata文件,然后才能重新启动应用程序。

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

我也尝试使用具有相同结果的NSDirectoryEnumerator:损坏总是与文件夹中的项目数相关联。

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

托德。

1 个答案:

答案 0 :(得分:0)

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

我已将NIB中的Table View和Table列连接到实体....哎呀。