在子上下文的NSPredicate中使用NSMangedObject替换获取请求

时间:2016-06-23 21:30:22

标签: ios core-data

我很好奇为NSFetchRequest制作谓词的含义,其中包括在子上下文上执行请求时的托管对象替换。

考虑个人和家庭实体。 (没关系模型或此查询的合理性。我只是对请求的细节感到好奇):

...
Family *parentContextFamily = <some NSManagedObject Family>;
...
[childContext performBlock:^{
     Family *familyInChildContext = [childContext existingObjectWithID:parentContextFamily.objectID error:nil];
     NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
     request.predicate = [NSPredicate predicateWithFormat:@"family = %@ AND state = %@ AND birthdate >= %@ AND birthdate <= %@",
                                 familyInChildContext,
                                 @"California",
                                 earliestDate,
                                 latestDate];
      NSArray *people = [childContext executeFetchRequest:request error:nil];
      ...
      // do some work on people
 }];

这有效吗?我正在对子上下文执行请求,用同一上下文中的NSManagedObject替换。我经常在主线程和后台线程上下文中使用此模式,但我想我从未在子上下文中使用它。

executeFetchRequest的调用使用

间歇性地在主线程上崩溃
  

致命异常:NSInvalidArgumentException

     

谓词无效:nil RHS

显然,当此请求在后台线程中的子上下文上执行时,内部核心数据将其传递给主线程上的主上下文。当NSPredicate传递给主要上下文时,NSManagedObject如何代表被替换的NSManagedObject

任何其他谓词参数都不可能为零,所以我专注于'familyInChildContext'。我也意识到我可以通过使用对象的objectID来避免任何歧义,但由于这种简单地替换 <div class="dropdown-container"> <span class="dropdown-arrow">V</span> <select id="edit-cid" name="cid" class="form-select required"><option value="2">Event Questions</option><option value="1" selected="selected">General Information</option><option value="5">History Museum</option><option value="3">Research Question</option><option value="4">Website Feedback</option></select> </div> 的模式非常方便,我想知道发生了什么。

0 个答案:

没有答案