IOS / Objective-C:核心数据NSPredicate使用IN不返回所有匹配(示例代码)

栏目: ios · 发布时间: 2021-05-06

简介  这篇文章主要介绍了IOS / Objective-C:核心数据NSPredicate使用IN不返回所有匹配(示例代码)以及相关的经验技巧,文章约2564字,浏览量438,点赞数7,值得推荐!

我试图在从核心数据获取过程中使用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里面) )


以上就是本文的全部内容,希望对大家的学习有所帮助,本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

编写高质量iOS与OS X代码的52个有效方法

【C语言】01-C语言概述

作为iOS程序员,最核心的60%能力有哪些?

iOS进阶 - iOS(Objective-C) 内存管理

iOS编译器(示例代码)

C语言知识整理(1):简介(示例代码)

iOS12 SiriKit新特性 shortcuts(一)(Objective-C版本)(示例代码)

C语言概述(示例代码)