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;
}

奇怪的是,我为我的取回返回了结果。这意味着有一组消息与我用于查询的组有关系,但在 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);

我每次都得到相同的组,但地址不同。

4

1 回答 1

0

哇!我查看了调用堆栈,才意识到我的 Group 实体从未在我用于获取请求的上下文的线程中创建。我需要传入组的 objectID 并在正确的上下文中创建一个新组。

我很好奇为什么没有抛出异常来访问拥有它的上下文之外的实体。

希望这对将来的其他人有所帮助!

于 2013-08-10T21:04:00.627 回答