NSManagedObjectContext最初很好,但是稍后访问时它是零

时间:2014-04-19 16:27:23

标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext

我有两个NSManageObjects,MidwifePatient。这两者都具有User的父实体。唯一的区别是Midwife对象与Patient有很多关系,而Patient对象与Midwife有多对多的关系

This shows the NSManagedObjects and their relationships

当我获得活跃用户时,它会正确返回用户,并确定它是Midwife还是Patient。您可以通过下面的图像看到它正确检索了我想要的对象,患者关系出现故障。 enter image description here

使用下面的代码我确定关系是一个错误然后尝试访问属性以使核心数据完成故障。然后我将对象添加到一个可变数组中,以便在集合视图的后期使用。

[User activeUserSuccess:^(id user) {
    self.activeMidwife = (Midwife *)user;
    self.patients = [@[] mutableCopy];

    [[[_activeMidwife patients] allObjects] enumerateObjectsUsingBlock:^(Patient *patient, NSUInteger idx, BOOL *stop) {
        NSLog(@"Is fault : %i", [patient isFault]);
        [patient fullName];
        NSLog(@"Is fault : %i", [patient isFault]);

        [_patients addObject:patient];
    }];

} failure:^(NSError *error) {
    NSLog(@"Error : %@", [error description]);
}];

第一个NSLog返回"Is fault : 1",然后一旦我调用fullName方法(这只是将forename和surname属性与空格放在一起),然后加载对象,第二个NSLog输出{{​​1}}虽然仍然在枚举块中我打印出"Is fault : 0",然后它返回一个有效的patient.mangaedObjectContext,然后将它添加到可变数组中,这将落后于活动的所有专利助产士。

问题是当我从managedObjectContext方法中访问_patents数组时,managedObjectContext为零。我的代码如下。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

在这两个- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { MDCCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; Patient *patient = _patients[indexPath.row]; NSLog(@"Is fault : %i", [patient isFault]); NSLog(@"Patitne name %@", patient.forename); NSLog(@"Is fault : %i", [patient isFault]); [[cell patientNameLabel] setText:[patient fullName]]; return cell; } 中,他们都输出NSLog。首次亮相时,我发现专利对象此时"Is fault : 1"对象的值为patent。有谁知道为什么或在此之前解决这个问题。

我的managedObjectContext只有persistentStore一次,可通过init访问。

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

快速回答反映意见。如果MOC超出范围,那么你保留的实体实例指针有内部指针指向现在为零的MOC。

除此之外,我不知道这些NSManagedObjects的可用性或可变性应该发生什么,这些NSManagedObject现在保留在你从它们获得的MOC范围之外。因此,对于您可以或不可以使用您创建的阵列做什么,可能会有更明智的答案。

答案 1 :(得分:0)

您可能最好重构您的设计,让MDCDataStore执行所有提取,并且只返回每个MidWife的患者阵列。

答案 2 :(得分:0)

我已经开始工作了。我不得不返回主要上下文中的托管对象。

通过添加以下代码来获取mainContext上的对象。

[fetchedObjects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    id entity = [[[MDCDataStore sharedInstance] mainContext] objectWithID:[obj objectID]];
    [objectsOnMainContxt addObject:entity];
}];

有更好的方法吗?

整个功能如下

+ (void)entityName:(NSString *)entityName predicate:(NSPredicate *)predicate relationshipKeyPathsForPrefetching:(NSArray *)relationshipKeyPathsForPrefetching success:(void (^)(NSArray *fetchedObjects))success failure:(void (^)(NSError *error))failure
{
    NSManagedObjectContext* context = [[[MDCDataStore sharedInstance] store] newPrivateContext];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];

    [context performBlock:^{
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        [fetchRequest setEntity:entityDescription];
        [fetchRequest setPredicate:predicate];
        [fetchRequest setRelationshipKeyPathsForPrefetching:relationshipKeyPathsForPrefetching];
        NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:nil];

        NSMutableArray *objectsOnMainContxt = [@[] mutableCopy];

        if([fetchedObjects count] > 0)
        {
            [fetchedObjects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                id entity = [[[MDCDataStore sharedInstance] mainContext] objectWithID:[obj objectID]];
                [objectsOnMainContxt addObject:entity];
            }];

            if(success)
            {
                success(objectsOnMainContxt);
            }
        }
        else if(failure)
        {
            NSError *error = [NSError errorWithCode:CoreDataErrorCodeEntityNotFound
                                         reason: @"There were no managed objects that matched the predicate and that existed in the context."
                                    description:[NSString stringWithFormat:@"No managed object matched the predicate '%@'.", [predicate predicateFormat]]
                                     suggestion:@"Ensure you are passing in the correct params into the predicate."];

            failure(error);
        }
    }];

}