我有一个UIDocument,我想由(1)一个txt文件和(2)几个jpg图像组成.我将txt和所有jpgs放入NSFileWrapper中.
当我加载UIDocument时,我需要txt文件中的信息非常快,所以我首先加载它并忽略所有图像,直到我真正需要它们.
虽然我知道如何懒洋洋地加载图像,但我不确定如何"懒洋洋地"保存图像(特别是在使用iCloud时,我不希望文件被不必要地上传/下载).假设我已经加载了所有图像并且没有更改它们.然后我想保存UIDocument,忽略所有图像(因为它们没有改变),但想要保存文本,因为它确实改变了.
我怎么做到这一点?它甚至可能吗?还是自动完成?或者我不应该将图像放在我的UIDocument中并让每个图像由不同的UIDocument处理?我害怕,这对我来说有点混乱.
到目前为止,这是我的代码,它将保存所有图像和文本(无论它们是否被更改):
UIDocument-(id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
NSMutableDictionary *wrappers = [NSMutableDictionary dictionary];
// the following puts a wrapper into a dictionary of wrappers:
[self encodeObject:self.text toWrappers:wrappers toFileName:@"text.data"];
[self encodeObject:self.photos toWrappers:wrappers toFileName:@"photos.data"];
NSFileWrapper *fileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:wrappers];
return fileWrapper;
}
Run Code Online (Sandbox Code Playgroud)
[self.doc saveToURL:self.doc.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) {
[self.doc closeWithCompletionHandler:^(BOOL success) {}];
}];
Run Code Online (Sandbox Code Playgroud) 我有一个NSFileWrapper目录,我想在其中更新某个FileWrapper.我想知道最好的方法是什么?
到目前为止,我已经使用了这段代码:
[self.fileWrapper addRegularFileWithContents:photoData
preferredFilename:@"photo.data"];
Run Code Online (Sandbox Code Playgroud)
但是,只要FileWraper已经存在,我就会在FileWrapper中看到重复的内容,如下所示:
"1__#$!@%!#__photo.data" = "<NSFileWrapper: 0x6bb0260>";
"2__#$!@%!#__photo.data" = "<NSFileWrapper: 0x6b89b80>";
"3__#$!@%!#__photo.data" = "<NSFileWrapper: 0x6ba1700>";
"4__#$!@%!#__photo.data" = "<NSFileWrapper: 0x6bc8480>";
"photo.data" = "<NSFileWrapper: 0x6bcfc50>";
Run Code Online (Sandbox Code Playgroud)
如何防止这种情况并简单地替换FileWrapper - 在本例中为photo.data?我没有找到任何替换NSFileWrapper类参考中的FileWrappers的方法.
我有一个UIDocument基于应用程序,使用NSFileWrappers来存储数据.'master'文件包装器包含许多其他目录文件包装器,每个包装器代表文档的不同页面.
每当我在UIDocument保存(in writeContents:andAttributes:safelyToURL:forSaveOperation:error:)时对文档进行更改时,应用程序崩溃.这是堆栈跟踪:

很明显,我正在修改UIDocument在后台枚举的文件包装器的同一个实例.实际上,我检查了当返回数据模型的快照时contentsForType:error:,返回的子文件包装器指向与数据模型中当前驻留(和正在编辑)的对象相同的对象,而不是副本.
- (id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError
{
if (!_fileWrapper) {
[self setupEmptyDocument];
}
return [[NSFileWrapper alloc] initDirectoryWithFileWrappers:[_fileWrapper fileWrappers]];
}
Run Code Online (Sandbox Code Playgroud)
这是实施此方法的认可方法(根据WWDC 2012会议218 - 使用带有UIDocument的iCloud).
所以我想问题是:这种方法如何是线程安全的?
当主文件包装器fileWrappers本身是目录文件包装器时,情况是否有所不同?如果受制裁的方法是错误的,应该怎么做?
我注意到Apple开始使用zip存档来替换iWork应用程序中的文档包(在Finder中显示为单个文件的文件夹).我正在考虑做同样的事情,因为我一直得到与我的文档包相关的支持电子邮件在将它们复制到Windows文件服务器时被破坏.
我的问题是在基于NSDocument的应用程序中执行此操作的最佳方法是什么?
我想最简单的方法是创建一个目录文件包装器,创建它的存档并在NSDocument中返回它
- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError
Run Code Online (Sandbox Code Playgroud)
但我不明白如何创建NSFileWrapper的zip存档.
我有一个基本的NSTextView,启用了丰富的文本和图形(在IB中).我想得到的是拖入的任何图像的路径和文件名,所以我可以将它们传递给另一个类.
我是NSAttributedString的新手,但我有一个循环使用enumerateAttributesInRange:options:usingBlock:寻找NSAttachmentAttributeName,这一切都正常.但是深入一点,我进入了fileWrapper类,显然无法给出项目的路径.
我如何获得NSTextAttachment的名称和路径?
相关:是否有更简单的方法来获取它们然后单步执行属性?
非常感谢!
cocoa nstextview nsattributedstring nstextattachment nsfilewrapper
你如何有效地检查Cocoa中的两个文件是否相同(具有相同的数据)?
上下文:我正在编写一个程序,它接收一个文件作为输入(输入文件)并将其复制到一个目录中.如果目录已包含具有相同名称的文件(同名文件),则仅当同名文件不同时,才应使用新名称复制输入文件.
很抱歉,如果这是显而易见的,但我正在努力如何从NSFileWrapper中提取组件,而且文档并不特别有启发性.
我有两个包装.一个人拥有一个简单的txt文件.另一个持有pageSettings.PageSettings是一个NSObject,它包含几个NSStrings,BOOL等.这是我的包装器(基于Apple的基于文档的iOS应用程序编程指南),我现在仍然试图再次提取信息:
if (self.fileWrapper == nil) {
self.fileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
}
NSDictionary *fileWrappers = [self.fileWrapper fileWrappers];
if (([fileWrappers objectForKey:@"page"] == nil) && (self.text != nil)) {
NSData *textData = [self.text dataUsingEncoding:NSUTF8StringEncoding];
NSFileWrapper *textFileWrapper = [[NSFileWrapper alloc] initRegularFileWithContents:textData];
[textFileWrapper setPreferredFilename:@"page"];
[self.fileWrapper addFileWrapper:textFileWrapper];
}
if (([fileWrappers objectForKey:@"pageSettings"] == nil) && (self.pageSettings != nil)) {
NSData *settingsData = [NSKeyedArchiver archivedDataWithRootObject:self.pageSettings];
NSFileWrapper *settingsWrapper = [[NSFileWrapper alloc] initRegularFileWithContents:settingsData];
[settingsWrapper setPreferredFilename:@"pageSettings"];
[self.fileWrapper addFileWrapper:settingsWrapper];
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是如何将txt文件和pageSettings加载回self.text和self.pageSettings?
我用- (NSData *)serializedRepresentation吗?如果是这样,怎么样?或者我只是像这样反转它:
NSDictionary …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用核心数据(使用UIManagedDocument)的应用程序,用于存储我想与iCloud同步的用户生成的数据.我还想在应用程序中同步用户使用相机拍摄的照片.
我读到将实际照片存储在核心数据中不是一个好主意; 相反,最好将照片存储在文件系统中,并将fileURL放入核心数据中.
使用此方法时,使用UIDocument将照片存储在文件系统中(在"文档"文件夹下)时,建议的方法是什么?我想过:
哪种方法更适合与iCloud同步照片?还有更好的方法吗?
可以说我有一个NSFileWrapper目录.该目录由多个级别的目录和文件组成.有些文件很大.所有这些文件都加载到内存中,还是懒得加载?
如果将它们加载到内存中,是否有其他NSFileWrapper类似功能的替代方法无法将文件加载到内存中?我能挂进去的东西UIDocument?
这适用于基于文档的应用程序,该应用程序使用UIDocument与iCloud同步的应用程序.文档可以在其中嵌入图像和视频.每个图像/视频都有一个HTML文档中显示的预览图像(缩略图).全尺寸图像或视频不应加载到内存中,而应按需加载.
我还需要一种方法来添加资源而不将其加载到内存中.像"initWithAsset:(ALAsset*)"这样的东西是理想的.
我有一个简单的模型对象,Location其中包含一些文本项和一个images : [UIImages]?. Location所以Codable我将文本位存储为 JSON,然后将图像写入相同的FileWrapper.
我的问题是如何存储图像文件和 [UIImage] 数组之间的关系。图像必须以相同的顺序返回。有没有办法可以连接到编码,以便数组被指向图像的 URL 替换?
或者,我应该始终将图像作为单独的文件(例如在缓存目录中)并将 [UIImage] 替换为 [URL]
nsfilewrapper ×10
ios ×5
cocoa ×4
uidocument ×4
icloud ×3
iphone ×3
objective-c ×3
cocoa-touch ×1
core-data ×1
file-io ×1
macos ×1
nsdocument ×1
nstextview ×1
save ×1
swift ×1
zip ×1