首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不关闭UIDocument重命名文档

不关闭UIDocument重命名文档
EN

Stack Overflow用户
提问于 2015-09-07 02:06:53
回答 1查看 1.1K关注 0票数 6

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

我有以下代码来移动该文件:

代码语言:javascript
复制
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 (参见Class/)

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-07 03:25:00

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

代码语言:javascript
复制
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];
  }];

});
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32430222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档