2015-09-07 74 views
2

如何在不关闭并重新打开文档的情况下使用打开的UIDocument重命名文档文件?关闭(保存),移动并重新打开文档需要很长时间。重命名文档而不关闭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

回答

4

的解决方案是使用背景队列,以避免死锁:

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]; 
    }]; 

});