我有一种销毁过时的 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;
}
奇怪的是,我为我的取回返回了结果。这意味着有一组消息与我用于查询的组有关系,但在 messageID 数组中没有 id_number。
但是,当我从控制台打印 message.groups 时,我得到0x1f83c740作为与我的查询中的组匹配的组的地址,但我的查询中的组的地址为0x1fe99db0,两个不同的地址。
因为我的查询中组的地址和关系中的组的地址不同,所以我的调用[message removeGroupsObject:group]
什么也不做。
为什么会发生这种情况?
更多信息:
如果有帮助,此调用将在具有 NSPrivateQueueConcurrencyType 上下文的后台线程中进行。
以下代码还返回一个地址与前面显示的其他两个组不同的组。
searchTerm = [NSPredicate predicateWithFormat:@"SELF == %@", group];
NSArray *groupResults = [RDGroup fetchManyWithPredicate:searchTerm context:context];
DLog(@"groupsResults: %@", groupResults);
我每次都得到相同的组,但地址不同。