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

-(BOOL)writeContents:(id)Contents到URL:(NSURL *)URL for SaveOperation:(UIDocumentSaveOperation)saveOperation originalContentsURL:(NSURL *)originalContentsURL错误:(NSError * __ autoreleasing *)outError
{
NSFileCoordinator *协调器= [[NSFileCoordinator分配] initWithFilePresenter:self];
NSError *错误=无;
[coordinatorordinateWritingItemAtURL:url options:0 error:&error byAccessor:^(NSURL * newURL){
NSData *数据=内容; //正确的非空NSData

/// [数据writeToFile:newURL:]有效,但覆盖原始文件

NSOutputStream * stream = [[[NSOutputStream alloc] initWithURL:newURL append:YES];
如果(流)
{
NSInteger写入= [流写入:data.bytes maxLength:data.length];
if(写成!= data.length)
{
//这里失败,写== -1
NSLog(@“将数据写入UIDocument失败:%@,错误:%@”,newURL,stream.streamError);
}
}
其他
{
NSLog(@“将数据写入iCloudDocument失败:%@”,newURL);
}
}];

如果(错误)
{
NSLog(@“协调写入失败%@,错误:%@”,网址,错误);
* outError =错误;
}

返回错误==零;
}

访问器块具有不同的newURL,例如:
url: file:///private/var/mobile/Library/Mobile%20Documents/XXXXXXX~com~test~test/test.docnewURL: 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];
[文档openWithCompletionHandler:^(BOOL成功){
如果(成功)
{
//更新一些文档数据
[self updateData:文档完成:无];

[document closeWithCompletionHandler:^(BOOL成功){
//在这里失败!
}];

}
}];

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/

10-09 07:43