NSFetchedResultsController,核心数据和线程

Posted

技术标签:

【中文标题】NSFetchedResultsController,核心数据和线程【英文标题】:NSFetchedResultsController, Core data and Threading 【发布时间】:2013-04-05 15:12:14 【问题描述】:

各位大侠们好

我很难弄清楚如何在后台线程中获取 NSManagedObjects,然后通过 NSFetchedResultsController 显示结果。

这是我目前的代码:

       _theManagedObjectContext = [[DataManager sharedInstance] mainManagedObjectContext]; 

   __block NSMutableArray *objectsIDs;

    [[[DataManager sharedInstance] backgroundManagedObjectContext] performBlock:^

        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        fetchRequest.entity = [NSEntityDescription entityForName:@"Ret" inManagedObjectContext:[[DataManager sharedInstance] backgroundManagedObjectContext]];

        NSArray *results =  [[[DataManager sharedInstance] backgroundManagedObjectContext] executeFetchRequest:fetchRequest error:nil];

        for (Ret *ret in results) 
            NSManagedObjectID *moID = [ret objectID];

            [objectsIDs addObject:moID]; 

            NSLog(@"%@", objectsIDs); 
        

        [[[DataManager sharedInstance] mainManagedObjectContext ] performBlock:^

            [self loadDishesWithObjectIDs:objectsIDs]; 

        ];



    ];

首先,我在后台线程中获取所有对象,然后将 NSMangedObjectID 传输到主线程。

在我的“loadDishes”方法中:

- (void)loadDishesWithObjectIDs:(NSArray *)objectsIDs 

     /*
    [NSFetchedResultsController deleteCacheWithName:@"dishes"];
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:**???**? managedObjectContext:_theManagedObjectContext sectionNameKeyPath:nil cacheName:@"dishes"];
    _fetchedResultsController.delegate = self;




    NSError *error = nil;


    if (![_fetchedResultsController performFetch:&error]) 
        NSLog(@"Fetch Failed");

    


    NSArray *theDishes = _fetchedResultsController.fetchedObjects;*/




如何通过从后台线程获取的 ObjectID 显示带有 NSFetchResultscontroller 的对象?

提前谢谢你:)

【问题讨论】:

【参考方案1】:

您需要创建一个类似这样的获取请求

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = [NSEntityDescription entityForName:@"Ret" 
                                  inManagedObjectContext:[[DataManager sharedInstance] mainManagedObjectContext]];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"self IN %@", objectIDs];

【讨论】:

以上是关于NSFetchedResultsController,核心数据和线程的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?