Как правильно переместить UID-документ в новое место в файловой системе? - PullRequest
6 голосов
/ 27 ноября 2011

У меня есть iOS-приложение на основе документов с подклассом UIDocument. Мне нужно иметь возможность перемещать файл, который он представляет в файловой системе. Я решил переместить его с NSFileManager, но это может испортить свойство UIDocument fileURL. Любые идеи о том, как решить эту маленькую головоломку?

Ответы [ 3 ]

5 голосов
/ 21 января 2012

Вы можете переименовать UIDocument, сначала закрыв его, а затем в обработчике завершения, переместив файл с помощью NSFileManager. После успешного перемещения файла инициализируйте новый экземпляр вашего подкласса UIDocument, используя новый URL-адрес файла:

NSURL *directoryURL = [_document.fileURL URLByDeletingLastPathComponent];    
NSFileManager *fileManager = [[NSFileManager alloc] init];    
NSString *filePath = [directoryURL.path stringByAppendingPathComponent:@"NewFileName"];

[_document closeWithCompletionHandler:^(BOOL success) {
    NSError *error;

    if (success)
        success = [fileManager moveItemAtPath:_document.fileURL.path toPath:filePath error:&error];

    if (success) {
        NSURL *url = [NSURL fileURLWithPath:filePath];

        // I handle opening the document and updating the UI in setDocument:
        self.document = [[MyDocumentSubclass alloc] initWithFileName:[url lastPathComponent] dateModified:[NSDate date] andURL:url];
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Unable to rename document" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
        [alert show];
        NSLog(@"Unable to move document: %@", error);
    }
}];
4 голосов
/ 21 августа 2013

Это может быть старым, но все еще актуальным.

Что вы хотите сделать, это следующее:

Для перемещения: переместите ваш файл, используя NSFileCoordinator, внутри блока координатора вызовите

[fileCoordinator itemAtURL:URL willMoveToURL:toURL];
[fileManager moveItemAtURL:newURL toURL:toURL error:&moveError];
[fileCoordinator itemAtURL:URL didMoveToURL:toURL];

Для удаления: перезаписать свой подкласс UIDocument или реализовать метод протокола представления файлов accommodatePresentedItemDeletionWithCompletionHandler:, чтобы закрыть документ.

- (void)accommodatePresentedItemDeletionWithCompletionHandler:(void (^)(NSError *))completionHandler;
{
[self closeWithCompletionHandler:^(BOOL success) {
    NSError *err;
    if (!success)
        err = [NSError error]; // implement your error here if you want

    completionHandler(err);
}];
}

Таким образом, он будет правильно обрабатывать перемещение.

0 голосов
/ 21 марта 2012

Я нашел это в спецификации класса UIDocument (5.1):

Реализация NSFilePresenter протокола

Класс UIDocument принимает протокол NSFilePresenter. Когда другой клиент пытается прочитать документ приложения на основе UIDocument, это чтение приостанавливается до тех пор, пока объекту UIDocument не будет предоставлена ​​возможность сохранить любые изменения, внесенные в документ.

Хотя некоторые реализации ничего не делают, UIDocument реализует все NSFilePresenter методы. В частности, UIDocument:

Реализация relinquishPresentedItemToReader: для пересылки входящего блока на performAsynchronousFileAccessUsingBlock:.

Реализует relinquishPresentedItemToWriter:, чтобы проверить, изменилась ли дата изменения файла; если файл новее, чем прежде, он вызывает revertToContentsOfURL:completionHandler: со значением fileURL в качестве параметра URL.

Реализация presentedItemDidMoveToURL: для обновления URL-адреса файла документа (fileURL).

В вашем подклассе UIDocument, если вы переопределите метод NSFilePresenter, вы всегда можете вызвать реализацию суперкласса (super).

Я тоже безнадежно искал и надеюсь, что вышесказанное поможет. Я еще не проверял это - прыгаю на нем прямо сейчас.

Итак, если я здесь ничего не пропущу, вам нужно переместить документ с помощью NSFileManager, а затем вызвать presentedItemDidMoveToURL: в вашем документе. Вероятно, вам нужно переместить файл с помощью NSFileCoordinator, чтобы убедиться, что у вас нет проблем.

Пожалуйста, исправьте все в этом ответе, что это неправильно. Я все еще n00b во всем этом.

...