メッセージと呼ばれる古い 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);
毎回異なるアドレスで同じグループを取得しています。