objective-c – NSFileWrapper,懒惰加载和保存

objective-c – NSFileWrapper,懒惰加载和保存,第1张

概述我有一个基于NSDocument的应用程序,使用文件包装器来保存加载其数据. 该文档可以有各种资源,所以我不想将所有内容加载到内存中.我可能会从根本上做错事,但是一旦我更改了一个(内部)文件然后保存,我就无法读取任何未加载到内存中的文件. 我将相关代码分离成一个单独的项目来重现这种行为,我得到相同的结果.基本流程是这样的: >我从磁盘加载现有文档.主要的fileWrapper是一个包含两个其他文 我有一个基于NSdocument的应用程序,使用文件包装器来保存和加载其数据.
该文档可以有各种资源,所以我不想将所有内容加载到内存中.我可能会从根本上做错事,但是一旦我更改了一个(内部)文件然后保存,我就无法读取任何未加载到内存中的文件.

我将相关代码分离成一个单独的项目来重现这种行为,我得到相同的结果.基本流程是这样的:

>我从磁盘加载现有文档.主要的fileWrapper是一个包含两个其他文件包(sub1和sub2)的目录文件包装器(我将调用该主文件).在这一点上没有加载两个内部的文件包装器.
>当用户想要编辑sub1时,它从磁盘加载.
>用户保存文档
>如果用户想要编辑其他文件(sub2),则无法加载.出现的错误:

-[NSfileWrapper regularfileContents] trIEd to read the file wrapper's contents lazily but an error occurred: The file Couldn’t be opened because it doesn’t exist.

以下是我项目中的相关代码:

这个代码可能会更容易阅读这个要点:
https://gist.github.com/bob-codingdutchmen/6869871

#define filename01 @"testfile1.txt"#define filename02 @"testfile2.txt"/** *  Only called when initializing a NEW document */-(ID)initWithType:(Nsstring *)typename error:(NSError *__autoreleasing *)outError {    self = [self init];    if (self) {        self.myWrapper = [[NSfileWrapper alloc] initDirectoryWithfileWrappers:nil];        NSLog(@"Initializing new document...");        Nsstring *testString1 = @"Lorem ipsum first sub file";        Nsstring *testString2 = @"This is the second sub file with completely unrelated contents";        NSfileWrapper *w1 = [[NSfileWrapper alloc] initRegularfileWithContents:[testString1 dataUsingEnCoding:NSUTF8StringEnCoding]];        NSfileWrapper *w2 = [[NSfileWrapper alloc] initRegularfileWithContents:[testString2 dataUsingEnCoding:NSUTF8StringEnCoding]];        w1.preferredfilename = filename01;        w2.preferredfilename = filename02;        [self.myWrapper addfileWrapper:w1];        [self.myWrapper addfileWrapper:w2];    }    return self;}-(NSfileWrapper *)fileWrapperOfType:(Nsstring *)typename error:(NSError *__autoreleasing *)outError {    // This obvIoUsly wouldn't happen here normally,but it illustrates    // how the contents of the first file would be replaced    NSfileWrapper *w1 = [self.myWrapper.fileWrappers objectForKey:filename01];    [self.myWrapper removefileWrapper:w1];    NSfileWrapper *new1 = [[NSfileWrapper alloc] initRegularfileWithContents:[@"New file contents" dataUsingEnCoding:NSUTF8StringEnCoding]];    new1.preferredfilename = filename01;    [self.myWrapper addfileWrapper:new1];    return self.myWrapper;}-(BOol)readFromfileWrapper:(NSfileWrapper *)fileWrapper ofType:(Nsstring *)typename error:(NSError *__autoreleasing *)outError {    self.myWrapper = fileWrapper;    return YES;}- (IBAction)button1pressed:(ID)sender {    // Read from file1 and show result in fIEld1    NSfileWrapper *w1 = [[self.myWrapper fileWrappers] objectForKey:filename01];    Nsstring *string1 = [[Nsstring alloc] initWithData:w1.regularfileContents enCoding:NSUTF8StringEnCoding];    [self.fIEld1 setStringValue:string1];}- (IBAction)button2pressed:(ID)sender {    // Read from file2 and show result in fIEld2    NSfileWrapper *w2 = [[self.myWrapper fileWrappers] objectForKey:filename02];    Nsstring *string2 = [[Nsstring alloc] initWithData:w2.regularfileContents enCoding:NSUTF8StringEnCoding];    [self.fIEld2 setStringValue:string2];}

底层的两个方法只是为了更新UI,所以我可以看到会发生什么.

>要更改文件的内容,我删除现有的fileWrapper并添加一个新的.这是我发现更改文件内容的唯一方法,以及我在其他SO答案中看到的方式.
>当文件从磁盘加载时,我保留了fileWrapper,所以我可以使用它(在上面的代码中称为myWrapper)

苹果文档说NSfileWrapper支持延迟加载和增量保存,所以我假设我的代码有一些根本的缺陷,我看不到.

解决方法 NSfileWrapper本质上是一个unix文件节点的包装器.如果文件被移动,则包装器保持有效.

您似乎遇到的问题是在保存期间创建新的文件包装是一个新的文件夹.系统将删除您以前的包装器,包括sub2.

要实现您想要的更改为增量保存,即仅将更改的零件保存到位.请参阅NSdocument中的“保存到位”.

总结

以上是内存溢出为你收集整理的objective-c – NSFileWrapper,懒惰加载和保存全部内容,希望文章能够帮你解决objective-c – NSFileWrapper,懒惰加载和保存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1026773.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存