重命名iCloud文档 [英] Rename an iCloud document

查看:113
本文介绍了重命名iCloud文档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

到目前为止,我的代码是创建新的本地文件并删除iCloud文件的代码.

What I have so far is code that creates a new local file and deletes the iCloud file.

是否可以重命名iCloud文档,使其保留在iCloud中?

GarageBand可以做到.可以重命名iCloud歌曲.重命名完成后,歌曲仍在iCloud中.但是GarageBand是Apple应用程序,因此它可能使用私有api.

GarageBand can do it. It's possible to rename an iCloud song. After the rename is done, the song is still in iCloud. However GarageBand is an Apple app, so it may use private apis.

我当前的代码:

- (void)moveFrom:(NSURL*)sourceURL
          moveTo:(NSString*)destinationName
      completion:(void (^)())completion
{
    MyDocument *document = [[MyDocument alloc] initWithFileURL:sourceURL];
    [document openWithCompletionHandler:^(BOOL success)
    {
        NSURL *fileURL = [self.localRoot URLByAppendingPathComponent:destinationName];
        DLog(@"Create %@", fileURL);
        [document saveToURL:fileURL
           forSaveOperation:UIDocumentSaveForCreating
          completionHandler:^(BOOL success)
        {
            NSLog(@"Saved %@", fileURL);
            [document closeWithCompletionHandler:^(BOOL success) {
                // Delete the old document from a secondary thread
                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^()
                {
                    NSFileCoordinator* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
                    [fileCoordinator coordinateWritingItemAtURL:sourceURL
                                                        options:NSFileCoordinatorWritingForDeleting
                                                          error:nil
                                                     byAccessor:^(NSURL* writingURL) {
                        NSFileManager* fileManager = [[NSFileManager alloc] init];
                        [fileManager removeItemAtURL:writingURL error:nil];
                        DLog(@"Deleted %@", sourceURL);
                        completion();
                    }];
                });
            }];
        }];
    }];
}

更新:仍然没有运气

我发现 -setUbiquitous:itemAtURL:destinationURL:error:不能用于重命名文档.

如果我在已经本地的文件上调用[setUbiquitous:NO itemAtURL:oldLocalURL destinationURL:newLocalURL error:& error],则:

If I invoke [setUbiquitous:NO itemAtURL:oldLocalURL destinationURL:newLocalURL error:&error] on an already local file, then:

Error Domain = NSCocoaErrorDomain代码= 512该操作无法完全的.(可可错误512.)"UserInfo = 0x1fdf6730{NSURL = file://localhost/var/mobile/Applications/4BABA000-B100-49FC-B928-B0F403FC75FF/Documents/LocalDrawing.td2/,NSUnderlyingError = 0x20940e80该操作无法完成.(LibrarianErrorDomain错误2-无法禁用未同步的同步项目.)}

Error Domain=NSCocoaErrorDomain Code=512 "The operation couldn’t be completed. (Cocoa error 512.)" UserInfo=0x1fdf6730 {NSURL=file://localhost/var/mobile/Applications/4BABA000-B100-49FC-B928-B0F403FC75FF/Documents/LocalDrawing.td2/, NSUnderlyingError=0x20940e80 "The operation couldn’t be completed. (LibrarianErrorDomain error 2 - Cannot disable syncing on a unsynced item.)"}

如果在已经存在的云文件上调用[setUbiquitous:YES itemAtURL:oldCloudURL destinationURL:newCloudURL error:& error],则:

If I invoke [setUbiquitous:YES itemAtURL:oldCloudURL destinationURL:newCloudURL error:&error] on an already cloud file, then:

Error Domain = NSCocoaErrorDomain代码= 512该操作无法完全的.(可可错误512.)"UserInfo = 0x208e9820{NSURL = file://localhost/var/mobile/Library/Mobile%20Documents/22DR89XVRF~com~opcoders~triangle-draw/Documents/CloudDrawing.td2/,NSUnderlyingError = 0x208d45b0该操作无法完成.(LibrarianErrorDomain错误2-无法在已同步的设备上启用同步项目.)}

Error Domain=NSCocoaErrorDomain Code=512 "The operation couldn’t be completed. (Cocoa error 512.)" UserInfo=0x208e9820 {NSURL=file://localhost/var/mobile/Library/Mobile%20Documents/22DR89XVRF~com~opcoders~triangle-draw/Documents/CloudDrawing.td2/, NSUnderlyingError=0x208d45b0 "The operation couldn’t be completed. (LibrarianErrorDomain error 2 - Cannot enable syncing on a synced item.)"}

因此 -setUbiquitous:itemAtURL:destinationURL:error:不能用于重命名文档.

Thus -setUbiquitous:itemAtURL:destinationURL:error: cannot be used for renaming documents.

推荐答案

我终于解决了它.到目前为止,这是我的代码:

I have finally solved it. This is my code so far:

- (void)_moveURL:(NSURL*)sourceURL
         destURL:(NSURL*)destinationURL
         success:(void (^)())successBlock
         failure:(void (^)(NSError *))failureBlock
{
    NSParameterAssert(sourceURL);
    NSParameterAssert(destinationURL);
    NSParameterAssert(successBlock);
    NSParameterAssert(failureBlock);

    // Do the actual renaming
    __block NSError *moveError = nil;
    __block BOOL moveSuccess = NO;
    void (^accessor)(NSURL*, NSURL*) = ^(NSURL *newURL1, NSURL *newURL2) {
        NSFileManager *fileManager = [[NSFileManager alloc] init];
        moveSuccess = [fileManager moveItemAtURL:sourceURL toURL:destinationURL error:&moveError];
    };

    // Coordinate renaming
    NSError *coordinatorError = nil;
    NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
    [coordinator coordinateWritingItemAtURL:sourceURL
                                    options:NSFileCoordinatorWritingForMoving
                           writingItemAtURL:destinationURL
                                    options:NSFileCoordinatorWritingForReplacing
                                      error:&coordinatorError
                                 byAccessor:accessor];
    if (moveSuccess) {
        successBlock();
        return;
    }
    if (moveError) {
        failureBlock(moveError);
        return;
    }
    if (coordinatorError) {
        failureBlock(coordinatorError);
        return;
    }
    NSAssert(NO, @"should not happen");
}

这篇关于重命名iCloud文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆