我在解密方面遇到了很多麻烦 Apple的文档 UIManagedDocument
,具体有以下几种方法:
- (id)additionalContentForURL:(NSURL *)absoluteURL error:(NSError **)error
- (BOOL)readAdditionalContentFromURL:(NSURL *)absoluteURL error:(NSError **)error
- (BOOL)writeAdditionalContent:(id)content toURL:(NSURL *)absoluteURL originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error
有没有人成功地将其他内容保存到UIManagedDocument包中的“附加内容”目录中?我希望使用UUID作为文件名(具有正确的文件扩展名)将直接图像(PNG,JPEG等)和视频(m4v等)保存到此目录中,并将对这些单个文件的引用存储为 NSString
我的持久存储中的文件路径。
信用去 Apple DTS 帮助我理解这门课。我正在分享他们在这里帮助我的一些例子(略有修改)。
好的,所以基本上它的工作原理如下:子类 UIManagedDocument
,并实现以下方法(其中 extraInfo
property只是在我们的子类上实现的NSDictionary):
- (BOOL)readAdditionalContentFromURL:(NSURL *)absoluteURL error:(NSError **)error
{
NSURL *myURL = [absoluteURL URLByAppendingPathComponent:@"AdditionalInformation.plist"];
self.extraInfo = [NSDictionary dictionaryWithContentsOfURL:myURL];
return YES;
}
- (id)additionalContentForURL:(NSURL *)absoluteURL error:(NSError **)error
{
if (!self.extraInfo) {
return [NSDictionary dictionaryWithObjectsAndKeys: @"Picard", @"Captain", [[NSDate date] description], @"RightNow", nil];
} else {
NSMutableDictionary *updatedFriendInfo = [self.extraInfo mutableCopy];
[updatedFriendInfo setObject:[[NSDate date] description] forKey:@"RightNow"];
[updatedFriendInfo setObject:@"YES" forKey:@"Updated"];
return updatedFriendInfo;
}
}
- (BOOL)writeAdditionalContent:(id)content toURL:(NSURL *)absoluteURL originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error
{
if (content) {
NSURL *myURL = [absoluteURL URLByAppendingPathComponent:@"AdditionalInformation.plist"];
[(NSDictionary *)content writeToURL:myURL atomically:NO];
}
return YES;
}
UIManagedDocument
将在需要时调用这些方法,自动保存您需要保存到文档包中的任何内容 AdditionalContent
目录。
如果您需要强行保存,只需在您的电话上拨打以下电话 UIManagedDocument
例如:
[self updateChangeCount:UIDocumentChangeDone];
目前,我并没有将它用于图像和视频 - 但这个例子应该足以让你满足。
-additionalContentForURL的文档:error:表示返回nil应该发出错误信号。
A return value of nil indicates an error condition. To avoid generating
an exception, you must return a value from this method. If it is not always
the case that there will be additional content, you should return a sentinel value (for example, an NSNull instance) that you check for in
writeAdditionalContent:toURL:originalContentsURL:error:.
我重写 -writeContents:andAttributes:safelyToURL:forSaveOperation:error:
为了另一个目的(在第一次保存新文档时做一些事情),并且调用super调用NSException之神,因为 contents
值是nil,而不是UIManagedDocument看似期望的NSDictionary。嗯。
你懂得越多...
附:我想这取决于-writeContents:andAttributes的一天中的时间:...它曾经引发了一个抱怨期待NSDictionary的异常,但后来又抛出一个异常抱怨我没有传递给它一个NSData。我的眉毛不能以比现在更像Spock的方式提升。