0

メッセージと呼ばれる古い NSManagedObjects を破棄する方法があります。

+ (void)syncMessagesByIDs:(NSArray *)messageIDs toGroup:(Group *)group context:(NSManagedObjectContext *)context
{
    // This is getting all the Messages that still have a relationship to this Group but
    // are not in our passed in set of messages and therefor should be removed
    // from the Group.
    NSPredicate *searchTerm = [NSPredicate predicateWithFormat:@"(%@ IN %K) && NOT (%K in %@)", group, @"groups", @"id_number", messageIDs];
    NSArray *results = [Message fetchManyWithPredicate:searchTerm context:context];

    for (Message *message in results) {
        DLog(@"message.groups %d", message.groups.count);
        [message removeGroupsObject:group];
        if (message.groups.count == 0) {
            [context deleteObject:message];
        }
    }
}


+ (NSArray *)fetchManyWithPredicate:(NSPredicate *)predicate context:(NSManagedObjectContext *)context
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    fetchRequest.entity = [NSEntityDescription entityForName:NSStringFromClass(self) inManagedObjectContext:context];
    fetchRequest.predicate = predicate;
    fetchRequest.returnsObjectsAsFaults = NO;

    NSArray *results = nil;
    NSError *error = nil;
    results = [context executeFetchRequest:fetchRequest error:&error];

    if (error) {
        // TODO: Handle error.
    }

    [fetchRequest release];

    return results;
}

奇妙なことに、フェッチに対して結果が返されました。これは、クエリに使用したグループと関係のある一連のメッセージがあることを意味しますが、メッセージ ID の配列に id_number がありません。

ただし、コンソールから message.groups を出力すると、クエリのグループに一致するグループのアドレスとして0x1f83c740が表示されますが、クエリのグループには0x1fe99db0という 2 つの異なるアドレスがあります。

クエリ内のグループと関係内のグループのアドレスが異なるため、への呼び出しは何もし[message removeGroupsObject:group]ません。

なぜこれが起こっているのでしょうか?

より詳しい情報:

それが役立つ場合、この呼び出しは、NSPrivateQueueConcurrencyType のコンテキストを使用してバックグラウンド スレッドで行われます。

次のコードは、前に示した他の両方のグループとは異なるアドレスを持つグループも返します。

searchTerm = [NSPredicate predicateWithFormat:@"SELF == %@", group];
NSArray *groupResults = [RDGroup fetchManyWithPredicate:searchTerm context:context];
DLog(@"groupsResults: %@", groupResults);

毎回異なるアドレスで同じグループを取得しています。

4

1 に答える 1