1

XMLドキュメントを解析し、バックグラウンドキューを使用してそのデータをCoreDataストアに保存しようとしています。iOS5で導入された新しいネストされたUIManagedObjectContextの概念を使用しています。

NSManagedObject会社に新しいカテゴリを追加しました。これは、会社固有のデータの解析を処理します。

- (void)parseAttributesFrom:(NSString*)xmlStr 
             inManagedObjectContext:(NSManagedObjectContext*)managedObjectContext 
  {
  NSManagedObjectContext * context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

  context.parentContext = self.managedObjectContext;
  [context performBlock:^{

                IBCompany *company = self;
                [company setValue:[[[document.root childNamed:@"CoIDs"] childWithAttribute:@"Type" value:@"CompanyName"] value] forKey:@"companyName"];
            ...

これが私がこのメソッドを呼び出す方法[company parseAttributesFrom:xmlStr inManagedObjectContext:self.managedDocument.managedObjectContext]; です。管理対象オブジェクトのコンテキストをパラメーターとしてメソッドに渡しても、問題は変わらないことに注意してください。

コードを実行すると、annualPeriodを会社に設定するとクラッシュし、エラーメッセージNSInvalidArgumentException::が表示されます'Illegal attempt to establish a relationship 'company' between objects in different contexts (source = <IBEstPeriod: ...

IBEstPeriod *annualPeriod = [NSEntityDescription insertNewObjectForEntityForName:@"IBEstPeriod" inManagedObjectContext:context];
[annualPeriod setCompany:company];

コードが同じバックグラウンドのアイデアで実行されているときに、エラーがさまざまなコンテキストに関連している必要がある理由を理解するのに苦労しています。助けていただければ幸いです!!

4

2 に答える 2

1

その理由はIBCompany *company = self;contextあなたがパスした後、別のコンテキストで新しい接続を設定したためだと思います。

それが理由。

于 2012-06-24T21:46:51.780 に答える
1

あなたはこれをすることはできません:

context.parentContext = self.managedObjectContext;

ここのようにUIManagedDocumentを使用している場合:

[company parseAttributesFrom:xmlStr inManagedObjectContext:self.managedDocument.managedObjectContext];

これは、UIManagedDocumentがすでにネストされたコンテキストを使用しており、self.managedDocument.managedObjectContextに親コンテキストが設定されているためです。今、あなたはそれを交換しています、そしてそれをすることによってあなたは物事を壊します。

これは、 UIManagedDocumentクラスリファレンスからの引用です。

非同期データ書き込みをサポートするために、CoreDataは実際にはネストされた管理対象オブジェクトコンテキストのペアを使用します。親コンテキストはプライベートスレッドで作成され、子コンテキストはメインスレッドで作成されます。子コンテキストは、managedObjectContextプロパティから取得します。

于 2012-06-25T06:17:32.933 に答える