我尝试在从核心数据获取期间使用NSPredicate
来过滤结果作为服务器同步的一部分。
我的NSPredicate
如下:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"iid IN %@", uids];
通过首先获取所有托管对象,我已经确定商店中大约有6000个托管对象,都使用了iids。大约有10个uid 以便谓词记录到控制台:
iid IN {"9037", "9036", "8953", "9023", "9034", "9029", "9028", "9024", "8959", "8957"}
从登出所有iid,我已经确认所有uid都匹配。但是,当我进行提取时,我只返回三到四个匹配而不是10.这个数字会有所不同。
我怀疑问题在于线程和上下文,因为我开始使用私有上下文来按照Apple的建议从服务器中删除uid。为了找出本地商店中的内容,我使用了主要的上下文。这是对主要环境的这种取消,但是,我不知道如何解决它。
感谢您就如何解决此问题提出任何建议。
同步代码:
NSManagedObjectContext *mainMOC = self.managedObjectContext;
NSManagedObjectContext*private =[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[private setParentContext:mainMOC];
[private performBlock:^{
myItems = [self convertFeedtoObject:latestItems];
[self importAndSaveItems:myItems inContext:private];
NSError *error = nil;
if (![self.private save:&error]) {
NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
abort();
}
[mainMOC performBlockAndWait:^{
NSError *error = nil;
if (![mainMOC save:&error]) {
}
else {
_managedObjectContext = mainMOC;
}
}];
}];
mainMOC=nil;
//从importAndSaveItems调用的提取代码
-(id) getExistingItems:(NSArray *)uids
{
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Items"];
NSManagedObjectContext *context = [Model sharedInstance].managedObjectContext;
NSError *error = nil;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"iid IN %@", uids];
fetchRequest.predicate = predicate;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Items" inManagedObjectContext:context];
fetchRequest.entity = entity;
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest
error:&error];
return results;
}
答案 0 :(得分:0)
不要使用主要上下文来获取getExistingItems
,在那里也使用私有上下文,你打破了主线程使用主要托管上下文的主要规则...因为你是从主要线程调用它私有上下文的队列(在performBlock
内)