我有两个NSManageObjects,Midwife
和Patient
。这两者都具有User
的父实体。唯一的区别是Midwife
对象与Patient
有很多关系,而Patient
对象与Midwife
有多对多的关系
当我获得活跃用户时,它会正确返回用户,并确定它是Midwife
还是Patient
。您可以通过下面的图像看到它正确检索了我想要的对象,患者关系出现故障。
使用下面的代码我确定关系是一个错误然后尝试访问属性以使核心数据完成故障。然后我将对象添加到一个可变数组中,以便在集合视图的后期使用。
[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
访问。
感谢您的帮助。
答案 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);
}
}];
}