【问题标题】:Rename document without closing UIDocument重命名文档而不关闭 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,则可以正常工作。

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

【问题讨论】:

    标签: ios uikit uidocument


    【解决方案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];
      }];
    
    });
    

    【讨论】:

      猜你喜欢
      • 2018-03-13
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      相关资源
      最近更新 更多