メインアプリウィンドウにドラッグされたフォルダーとアイテムを列挙し、見つかった各 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個ほどのアイテムしかないフォルダーをドラッグすると、完全に正常に機能するからです。約 200 個以上のファイルを保持している場合directoryContents
、Core Data はそれを正しく保存していないようで、アプリを再起動する前に破棄する必要がある storedata ファイルが破損します。
保存を待っているNSManagedObjectsif (idx % 20 == 0)...
を多かれ少なかれ保存するように変更できますが、同じ結果になります。
また、同じ結果で NSDirectoryEnumerator を使用しようとしました。破損は常にフォルダー内のアイテムの数に関連しています。
私は Core Data が好きですが、時々道に迷うことがあります。
トッド。