IOS / Objective-C:核心数据NSPredicate使用IN不返回所有匹配
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS / Objective-C:核心数据NSPredicate使用IN不返回所有匹配相关的知识,希望对你有一定的参考价值。
我试图在从核心数据获取过程中使用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: %@
%@", [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;
}
答案
不要使用主上下文来获取getExistingItems
,在那里使用私有上下文,你打破了主线程使用主要托管上下文的主要规则...因为你是从私有上下文的队列调用它(在performBlock
里面) )
以上是关于IOS / Objective-C:核心数据NSPredicate使用IN不返回所有匹配的主要内容,如果未能解决你的问题,请参考以下文章
IOS / Objective-C:核心数据NSPredicate使用IN不返回所有匹配
在 iOS 中使用核心图形上下文绘制圆 - Objective-C 或 Swift