0

ドキュメント モデルに NSPersistentDocument を使用する Mac ドキュメント ベースのアプリがあります。

新しいドキュメントが作成されると、アプリはいくつかのデフォルト データ (いくつかのスポーツ オブジェクトとユーザー データ) を initiWithType メソッドでドキュメントに追加します。

- (id)initWithType:(NSString *)typeName error:(NSError **)outError {
self = [super initWithType:typeName error:outError];

NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

[[SportManagement sharedManager] addDefaultSports:managedObjectContext];
[[UserManagement sharedManager] addDefaultUser:managedObjectContext];

[managedObjectContext processPendingChanges];

return self;

}

アプリには、いくつかのハードウェアからデータをインポートするインポート関数があり、スレッドで実行されます。これは次のように設定します (managedObjectContext は NSPersistentDocument のものです)。

dispatch_async(dispatch_get_global_queue(0, 0), ^ {

    NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
    [moc setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]];

データは、ハードウェアから多数の NSManagedDataObject アイテムにインポートされます。各 ManagedObject には「Sport」フィールドがあり、ドキュメントの作成時に作成されたスポーツ オブジェクトの 1 つを入力する必要があります。

- (id)initWithType:(NSString *)typeName error:(NSError **)outErrorただし、スレッド (moc) の新しい ManagedObjectContext には、追加されたスポーツ オブジェクトは存在しません。

アプリを実行して新しいドキュメントを作成し、アプリを 1 分ほどアイドル状態にしてからインポートを試みると、Sport オブジェクトはスレッドの管理対象オブジェクト コンテキストに存在します。

スレッド内の新しい ManagedObjectContext を NSPersistantDocument のメインのものと同期するにはどうすればよいですか?

[managedObjectContext processPendingChanges];とを試しまし[managedObjectContext setStalenessInterval];たが、どちらもこの問題を解決していないようです。

興味深いことに、これは Mac OS X 10.8 では発生せず、10.7 でのみ発生するようです。

4

1 に答える 1

1

通知を受け取るように「メイン」MOC をセットアップNSManagedObjectContextDidSaveNotificationし、バックグラウンド MOC が で保存されたときに変更をマージし-mergeChangesFromContextDidSaveNotification:ます。

編集

OK、MOC で変更を行ったように見えますが、これは単なるスクラッチパッドです。データが実際に永続ストアに保存されるまで、永続ストアは新しいデータの変更を認識しません。

したがって、他の MOC を作成して PSC に接続すると、それらの変更が認識されません。

「しばらくすると」機能するため、自動保存がいつ開始されるかがわかります。

最初のコンテンツを作成した後、ドキュメントを手動で保存してみます。

于 2012-09-12T20:49:20.663 に答える