如何用打开的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 (参见Class/)
但是,当在打开文档时调用上述代码时,它会挂起,大概是在等待oldPath (-[NSFileCoordinator(NSPrivate) _blockOnAccessClaim:])上的锁。如果没有活的UIDocument,就可以正常工作。
相关的,顶部的答案建议关闭并重新打开UIDocument:What is the proper way to move a UIDocument to a new location on the file-system
发布于 2015-09-07 03:25:00
解决方案是使用后台队列来避免死锁:
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];
}];
});https://stackoverflow.com/questions/32430222
复制相似问题