我很好奇为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>
的模式非常方便,我想知道发生了什么。