autosavesInPlace приводит к сбою сохранения нового документа
У меня есть приложение на основе NSPersistentDocument, которое не может сохранить новый документ, когда autosavesInPlace
настроен на возврат YES
, вернуть NO
и проблема исчезает.
- Я создаю новый документ
- Внести некоторые изменения
- Сохраните его
NSSaveAsOperation
имя документа и URL-адрес изменяются, и все выглядит хорошо, но при следующем сохранении произойдет очень информативное
NSPersistentStoreSaveError = 134030, // unclassified save error - something we depend on returned an error
Это происходит только тогда, когда документ пытается выполнить сохранение после NSSaveAsOperation
, Любой другой тип сохранения будет работать нормально, как при изменении существующего документа. Интересным эффектом является то, что если я не изменю имя или местоположение, я не получу эту проблему либо.
Я получаю исключение следа
кадр № 0: 0x00007fff988143c5 libobjc.A.dylib
objc_exception_throw frame #1: 0x00007fff94c5f5f9 CoreData
- [NSPersistentStore (_NSInternalMethods) _preflightCrossCheck] + 697 кадра № 2: 0x00007fff94c3198b CoreData-[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 603 frame #3: 0x00007fff94c5aa98 CoreData
- [NSManagedObjectContext save:] + 456 кадр № 4: 0x00007fff91baa101 AppKit-[NSPersistentDocument writeToURL:ofType:forSaveOperation:originalContentsURL:error:] + 3743 frame #5: 0x0000000100002de7 ZZZZ
- [ZZZZDocument writeToURL: ofType: forSaveOperation: originalContentsURL: error:] + 135 при ZZZZDocument.m:209 кадров # 6: 0x00007fff91baabc7 AppKit-[NSPersistentDocument writeSafelyToURL:ofType:forSaveOperation:error:] + 611 frame #7: 0x0000000100002ea3 ZZZZ
- [ZZZZDocument writeSafelyToURL: ofType: forSaveOperation: ошибка:] + 115 при ZZZZDocument.m:223
есть идеи?
1 ответ
Невозможно распаковать файл данных ядра
В случае, если вы пытаетесь поймать NSSaveAsOperation
и выполнить миграцию в постоянном хранилище для этого перечисления при построении ...-journal
файл не будет создан как вне песочницы.
-(void)saveToURL:(NSURL *)url ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation completionHandler:(void (^)(NSError *))completionHandler
{
NSLog(@" save op = %ld to %@ ",saveOperation,url);
NSURL *targeturl = url;
if(saveOperation == NSSaveAsOperation)
{
//migrate pstore
NSPersistentStore *store = [self.managedObjectContext.persistentStoreCoordinator.persistentStores lastObject];
if (store)
{
NSMutableDictionary *opts = [NSMutableDictionary dictionary];
[opts setValue:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
[opts setValue:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
NSError *error = NULL;
NSPersistentStore *newstore = [self.managedObjectContext.persistentStoreCoordinator migratePersistentStore:store toURL:url options:opts withType:store.type error:&error];
if(newstore == nil)
{
NSLog(@"migration error %@",[error localizedDescription]);
}
self.fileURL = url;
}
}
[super saveToURL:targeturl ofType:typeName forSaveOperation:saveOperation completionHandler:completionHandler];
}
Таким образом, нам нужно обернуть файл в пакет / папку, что нетривиально, используя NSPersistentDocument
фреймворк.
Вот ждем NSManagedDocument
(Это хорошо API)