重命名文档而不关闭 UIDocument

Posted

技术标签:

【中文标题】重命名文档而不关闭 UIDocument【英文标题】:Rename document without closing UIDocument 【发布时间】:2015-09-07 02:06:53 【问题描述】:

如何使用打开的 UIDocument 重命名文档文件而不关闭并重新打开文档?关闭(保存)、移动和重新打开文档需要太长时间。

我有以下移动文件的代码:

NSFileCoordinator* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
[fileCoordinator coordinateWritingItemAtURL:oldPath
                                    options:NSFileCoordinatorWritingForMoving
                           writingItemAtURL:newPath
                                    options:NSFileCoordinatorWritingForReplacing
                                      error:&coordinatorError
                                 byAccessor:^(NSURL *newURL1, NSURL *newURL2) 
  // Rename the file.
  NSFileManager* fileManager = [NSFileManager defaultManager];
  [fileCoordinator itemAtURL:oldPath willMoveToURL:newPath];
  [fileManager moveItemAtURL:newURL1 toURL:newURL2 error:nil];
  [fileCoordinator itemAtURL:oldPath didMoveToURL:newPath];
];

根据文档UIDocument 实现presentedItemDidMoveToURL: 以更新其fileURL(参见https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDocument_Class/)

但是,当在文档打开的情况下调用上述代码时,它会挂起,大概是在等待锁定 oldPath (-[NSFileCoordinator(NSPrivate) _blockOnAccessClaim:])。如果没有生活UIDocument,则可以正常工作。

相关的,最佳答案建议关闭并重新打开UIDocument:What is the proper way to move a UIDocument to a new location on the file-system

【问题讨论】:

【参考方案1】:

解决方案是使用后台队列来避免死锁:

dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^(void) 

  NSError *coordinatorError = nil;

  NSFileCoordinator* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
  [fileCoordinator coordinateWritingItemAtURL:oldPath
                                    options:NSFileCoordinatorWritingForMoving
                           writingItemAtURL:newPath
                                    options:NSFileCoordinatorWritingForReplacing
                                      error:&coordinatorError
                                 byAccessor:^(NSURL *newURL1, NSURL *newURL2) 
    // Rename the file.
    NSFileManager* fileManager = [NSFileManager defaultManager];
    [fileCoordinator itemAtURL:oldPath willMoveToURL:newPath];
    [fileManager moveItemAtURL:newURL1 toURL:newURL2 error:nil];
    [fileCoordinator itemAtURL:oldPath didMoveToURL:newPath];
  ];

);

【讨论】:

以上是关于重命名文档而不关闭 UIDocument的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 重命名而不重构

重命名核心数据实体而不丢失数据

Terraform 重命名资源而不删除

在 PHPStorm 中重命名文件而不重构

如何使用 java 代码重命名和移动文件而不删除内容

如何删除一列并创建一个新列而不是在 EF Core 中重命名?