2013-10-08 2 views
2

Я не могу найти надежную документацию, которая объясняет правильную процедуру удаления UIManagedDocument и, в частности, тот, где параметры iCloud включены.Каков правильный способ удаления UIManagedDocument?

Я понимаю, что эта опция удалит файл в этом файлеURL. И это выглядит нормально, если iCloud не используется.

[[NSFileManager defaultManager] removeItemAtURL:fileURL error:&error]; 

Если ICloud используется, то CoreData создает файлы повсюду, в том числе и в/Document/CoreDataUbiquitySupport и в папке ICloud/CoreData. Поэтому в этом случае мне нужно позвонить removeUbiquitousContentAndPersistentStoreAtURL для каждого магазина в UIManagedDocument до звонка [NSFileManager removeItemAtURL]. Если это так документировано?

[NSPersistentStoreCoordinator removeUbiquitousContentAndPersistentStoreAtURL:storeURL 
                    options:@{NSPersistentStoreUbiquitousContentNameKey:fileName, 
    NSMigratePersistentStoresAutomaticallyOption:@YES, 
     NSInferMappingModelAutomaticallyOption:@YES, 
          NSSQLitePragmasOption:@{ @"journal_mode" : @"DELETE" }} 
                     error:&error]; 

ответ

1

Для содержимого ядра-данных ICloud вы хотите вызвать статический метод removeUbiquitousContentAndPersistentStoreAtURL:options:error: на NSPersistentStoreCoordinator класса, а затем вызвать removeItemAtURL:error:

Смотрите deleteManagedDocumentWithIdentifier: в моем APManagedDocument проекте. Это находится в ветке ubiquitous_experiment, в которой я сейчас работаю над завершением, прежде чем слить его обратно в главную ветку.

+0

И предполагается ли это, чтобы файл был удален с других устройств, или у меня есть логика в приложении на других устройствах, чтобы обнаружить, что файл больше не находится в iCloud и делает то же самое на этом устройстве? И какова логика обнаружения того, что файл удален? Любая документация от Apple? –

+0

Вызов 'removeUbiquitousContentAndPersistentStoreAtURL: options: error' удалит журналы транзакций Core Data из iCloud и удалит постоянный файл хранилища, вызов' removeItemAtURL: error' удалит пакет 'UIManagedDocument'. Теперь, когда я думаю об этом, так как я храню свои документы в вездесущем магазине, мне нужно сначала «setUbiquitous: NO», чтобы iCloud забыл об этом. См. WWDC 2013 Session 207 для получения дополнительной информации о 'removeUbiquitousContentAndPersistentStoreAtURL: options: error' – dtrotzjr

+0

Уверен, но что происходит на других устройствах, когда приложение запускается на них? Принимая во внимание, что у них, вероятно, все еще есть рабочая копия базы данных, я не вижу уведомления в документах для Core Data, чтобы сообщить нам: «К сожалению, кто-то удалил все в облаке, что вы хотите сделать сейчас: a) build новый экземпляр и верните его в облаке, б) сохраните свою копию и сделайте ее только локальной, c) удалите свою копию или d) давайте примем решение ? » –

1

Вот мои два цента по проблеме. Я пробовал, что рекомендовал dtrotzjr и не имел большого успеха. Кажется, что removeUbiquitousContentAndPersistentStoreAtURL: options: error: отлично подходит для очистки данных в UIManagedDocument, но папка Logs все еще существует, а также остатки файла, который я пытаюсь удалить. Вот простой метод для полного удаления UIManagedDocument из ICloud или местных Docs:

+ (void)deleteDocumentURL:(NSURL *)url{ 
    //if we have an iCloud Document, remove it from the UbiquitouseKeyValueStore 
    if ([self isiCloudURL:url]) { 
     [[NSUbiquitousKeyValueStore defaultStore] removeObjectForKey:[url lastPathComponent]]; 
    } 

    //do the delete on another thread 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil]; 
     NSError *coordinationError; 

     [coordinator coordinateWritingItemAtURL:url 
            options:NSFileCoordinatorWritingForDeleting 
             error:&coordinationError 
           byAccessor:^(NSURL *newURL) { 
     NSError *removeError; 
     //code for performing the delete 
     [[NSFileManager defaultManager] removeItemAtURL:newURL error:&removeError]; 

     //if we have an iCloud file... 
     if ([self isiCloudURL:url]) { 
      //remove log files in CoreData directory in the cloud 
      NSURL *changeLogsURL = [[self urlForiCloudLogFiles] URLByAppendingPathComponent:[url lastPathComponent]]; 
       [[NSFileManager defaultManager] removeItemAtURL:changeLogsURL error:&removeError]; 
      } 
     }]; 
    }); 
} 

Это довольно много кода от CS193 курса Стэнфордского 2012 + удалить папки списка изменений, и он работает на местной и ICloud документации. Пожалуйста, дайте мне знать, если вы видите какие-либо проблемы с удалением этого пути.

+0

взгляните на эту ссылку, где я разместил несколько примеров кода и демонстрационное видео о том, как я получил его работу довольно надежно. Он показывает локальные каталоги и создаваемые и очищенные каталоги iCloud.http: //ossh.com.au/design-and-technology/software-development/uimanageddocument-icloud-integration/. –

+0

Прохладный, спасибо Дункан. Эта документация выглядит реально перспективной :) –

+0

Любая идея, почему они делают удаление в другом потоке? –

Смежные вопросы