追加コンテンツを UIManatedDocument ファイル パッケージに保存するにはどうすればよいですか?
-
27-10-2019 - |
質問
解読するのにとても苦労しています 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
追加コンテンツを UIManatedDocument パッケージ内の「追加コンテンツ」ディレクトリに保存できた人はいますか?ファイル名として UUID を使用し(正しいファイル拡張子付き)、ストレート画像(PNG、JPEG など)とビデオ(m4v など)をこのディレクトリに保存し、これらの個々のファイルへの参照を次のように保存しようとしています。 NSString
永続ストア内のファイル パス。
解決
クレジットは次のとおりです アップルDTS このクラスを理解するのを助けてくれて。彼らが私を助けてくれた例の一部をここで共有します(少し修正しました)。
OK、基本的には次のように動作します。サブクラス UIManagedDocument
, 、次のメソッドを実装します (ここで、 extraInfo
プロパティはサブクラスに実装された単なる 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 であり、UIManatedDocument が期待しているように見える NSDictionary ではありません。ふーむ。
知れば知るほど…
追伸-writeContents:andAttributes:... の時間帯に依存すると思います。かつては NSDictionary を期待しているという例外をスローしましたが、その後、NSData を渡さなかったという例外をスローしました。私の眉毛は今以上にスポックらしく上げられています。