NSPersistentDocumentサブクラスでは、ドキュメントを保存するときにメタデータをドキュメントに保存する必要があります。もちろん、ドキュメントを開いたときにメタデータを読み戻す必要があります。私はそれを機能させましたが、それがそれを処理する適切な方法であるかどうかはわかりません。(私のテストは、保存されてから再度開かれた新しい未保存のドキュメントを反映しています。新しい未保存のドキュメントには、最初の保存後までNSPersistentStoreが割り当てられていません。)
これは、これを処理する方法のテストと思考プロセスに関連するコメントを含む私の作業コードです。
- (BOOL)readFromURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError
{
// No persistent store available yet
BOOL result = [super readFromURL:absoluteURL ofType:typeName error:outError];
// Persistent store available, but metadata may be already altered by configurePersistentStoreCoordinatorForURL:
// if I were set the data there instead of in writeToURL:
if (result == YES)
{
// Read metadata
NSPersistentStore *persistentStore = [self.managedObjectContext.persistentStoreCoordinator persistentStoreForURL:absoluteURL];
NSString * uuid = [persistentStore metadata][DefaultLocationUUIDKey];
self.defaultLocationUUID = uuid;
}
return result;
}
- (BOOL)writeToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error
{
// No persistent store available yet
BOOL result = [super writeToURL:absoluteURL ofType:typeName forSaveOperation:saveOperation originalContentsURL:absoluteOriginalContentsURL error:error];
// Persistent store available, but has already been saved by this point
// Get mutable copy of existing metadata and update with new data
NSPersistentStore *persistentStore = [self.managedObjectContext.persistentStoreCoordinator persistentStoreForURL:absoluteURL];
NSMutableDictionary *metadata = [persistentStore.metadata mutableCopy];
metadata[DefaultLocationUUIDKey] = self.defaultLocationUUID;
// Use this method because it saves the metadata directly to the file without having to re-save the document, is this correct? It works.
// Are their negative side effects to altering the metadata in this way while the file is open? I haven't tested all possibilities.
NSError *metadataError = nil;
[NSPersistentStoreCoordinator setMetadata:metadata forPersistentStoreOfType:typeName URL:absoluteURL error:&metadataError];
return result;
}
// Called for both open and save, but not for new documents (which is fine, use initWithType:error:)
- (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error
{
// No persistent store available yet
BOOL result = [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:storeOptions error:error];
// Persistent store available, but how to determine if opening existing or saving a new document?
// Don't want to alter existing record unless saving a new document.
return result;
}
NSPersistentDocumentを使用するときに多くのことを処理するのに最適な方法については、ドキュメントが少しまばらに見えるため、提案を歓迎します。
ありがとう。