2015-09-07 38 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]; 
    }]; 

});