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:无法显示核心数据信息

IOS / Objective-C:核心数据NSPredicate使用IN不返回所有匹配

Objective-c 应用更新和核心数据

在 iOS 中使用核心图形上下文绘制圆 - Objective-C 或 Swift

SwiftUI 应用程序中上下文保存的核心数据 Objective-C 异常

iOS进阶:Objective-C底层原理