4

私は次の構造を持っています

永続ストア <-> 親コンテキスト <-> MOC (メイン スレッド上) <-> バックグラウンド スレッド MOC (MOC = 管理対象オブジェクト コンテキスト)

だから、バックグラウンドコンテキストでいくつかの作業を行っています

// Create a background context.
NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
context.parentContext = self.document.managedObjectContext;
// Start using it, but in its own thread!
[context performBlock:^
{...

テーブルからいくつかのオブジェクトをフェッチし、コンテキストでそれらのいくつかを削除します。

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"User"];
NSArray* userQueryResults = [context executeFetchRequest:request error:&error];
for (int i = 0; i < userQueryResults.count; i++)
{
   if(someCondition)
   [context deleteObject:[userQueryResults objectAtIndex:bla];
}

ここで、残りのユーザーだけを配列に再取得したいとします...

最初にそこにいたすべてのユーザーを再取得しますか、それとも削除されていないユーザーのみを再取得しますか?

「コンテキスト」を保存した場合、違いはありますか?

基本的に、ネストされたコンテキストでのフェッチと保存の違いを理解しようとしています...

ありがとう

4

1 に答える 1

2

-[NSFetchRequest setIncludesPendingChanges] プロパティを設定することにより、両方の方法でユーザーを再取得できます。デフォルト値は YES です。値が NO の場合、フェッチ要求は保存されていない変更のチェックをスキップし、永続ストア内の述語に一致するオブジェクトのみを返します。

子コンテキストを保存すると、変更が親コンテキストにプッシュされるだけです。最後に、変更を永続ストアに表示するには、親コンテキストを保存する必要があります。これを行うには、次のコード スニペットを使用できます。

[context performBlock:^{
    NSError* error = nil;
    [context save:&error];
    [self.document.managedObjectContext performBlock:^{
        NSError* parentError = nil;
        [self.document.managedObjectContext save:&parentError];
    }];
}];
于 2013-02-10T10:37:38.660 に答える