ios - 如何在iCloud中对UIDocument进行增量写入?

标签 ios iphone objective-c icloud uidocument

我在 iCloud 无处不在的容器中有 UIDocument,我需要在保存文档时将数据附加到文件。我根据 UIDocument 文档覆盖了 readFromURL::writeContents::::: 方法:

-(BOOL) writeContents:(id)contents toURL:(NSURL*)url forSaveOperation:(UIDocumentSaveOperation)saveOperation originalContentsURL:(NSURL*)originalContentsURL error:(NSError *__autoreleasing *)outError
{
    NSFileCoordinator* coordinator = [[NSFileCoordinator alloc] initWithFilePresenter:self];
    NSError* error = nil;
    [coordinator coordinateWritingItemAtURL:url options:0 error:&error byAccessor:^(NSURL *newURL) {
        NSData* data = contents; //correct, non-empty NSData

        ///[data writeToFile:newURL :] works, but overwrite original file

        NSOutputStream* stream =[[NSOutputStream alloc] initWithURL:newURL append:YES];
        if (stream)
        {
            NSInteger written = [stream write:data.bytes maxLength:data.length];
            if (written != data.length)
            {
                //failed here, written == -1
                NSLog(@"Write data to UIDocument failed: %@, error: %@", newURL, stream.streamError);
            }
        }
        else
        {
            NSLog(@"Write data to iCloudDocument failed: %@", newURL);
        }
    }];

    if (error)
    {
        NSLog(@"Coordinated write failed %@, error: %@", url, error);
        *outError = error;
    }

    return error == nil;
}

访问 block 有不同的newURL,例如:

url: file:///private/var/mobile/Library/Mobile%20Documents/XXXXXXX~com~test~test/test.doc

newURL: file:///private/var/mobile/Applications/5631D484-7661-4E9E-A342-B25297FC0E18/tmp/(A%20Document%20Being%20Saved%20By%20test%20)/test .doc.

[stream write::] 失败,因为 newURL 文件不存在,我无法附加数据,只能创建包含所有文档内容的文件。

文档编辑代码:

NSURL* url = [self.containerURL URLByAppendingPathComponent:kCloudDocumentName];

MyDocument* document = [[MyDocument alloc] initWithFileURL:url];
[document openWithCompletionHandler:^(BOOL success) {
    if (success)
    {
        //update some document data
        [self updateData:document completion:nil];

        [document closeWithCompletionHandler:^(BOOL success) {
            //failed here!
        }];

    }
}];

MyDocument 存在于位于 url 的无处不在的容器中,并且文档具有 Normal 状态。

在这种情况下我如何进行增量写入?怎么了?

最佳答案

更改 UIDocumnet 中的数据后,您可以使用:

-[UIDocumnet saveToURL:UIDocumnet.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil];

不确定,它是否正确,但它在我的应用程序中有效。如果有错,请大家指正。

您可能需要在您的 UIDocumnet 子类中重写此方法:

- (id) contentsForType:(NSString *)typeName error:(NSError **)outError

关于ios - 如何在iCloud中对UIDocument进行增量写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21426445/

相关文章:

ios - 顺时针旋转按钮,然后回到原来的位置

iphone - 将 NSNumber 设置为 NSManagedObject 属性

ios - xcode 8 swift 3 单元格之间的 UItableview 空间?

objective-c - iPhone : How to get the currency symbol from an amount string?

ios - alljoyn框架ios错误: cannot parse the debug map for

objective-c - 如何让 NSNumberFormatter 显示无穷大符号 (∞)?

ios - NSAttributedString 未正确显示

iphone - 7次按键后UITextField崩溃

ios - Phonegap 不旋转方向?

iphone - 向类似于 Safari 和 Articles 的 UIWebView 添加标题 View