ドキュメント モデルに 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 でのみ発生するようです。