如何在后台线程上获取核心数据,同步读取主线程上的结果?

时间:2017-10-18 19:37:03

标签: ios core-data

如果我在核心数据存储中有100,000个实体,我怎样才能在后台线程中访问/ load / fetch所有100,000个,并且一旦加载/获取访问主线程/其他线程上的这些实体的属性? (例如,显示UICollectionView中的项目)我将使用批处理来避免将所有100,000个加载到内存中 - 但我需要确切知道初始加载后有多少个。

这样的事情:

// The load occurs on a background thread
[self loadCoreData: ^{
    // Once loaded, dispatch back onto the main thread to get the number of
    // entities, or I could do something like [self getEntityMatchingProperties:...]
    // etc. the point being it accesses entity information that has been loaded but
    // on a different thread.
    dispatch_async(dispatch_get_main_queue(), ^{
        self.title = [self getNumberOfCoreDataEntities];
    });
}];

编辑:另一个(更确切的例子):

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // The load occurs on a background thread
    [self loadCoreData: ^{
        [self.collectionView reloadData];
    }];
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return [self numberOfItemsLoadedFromCoreData];
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    ...
    Entity *entity = [self getItemLoadedFromCoreDataAtIndexPath:indexPath];
    ...
}

在第二个例子中,我想尝试使用NSFetchedResultsController - 我是否有这种方法的完整示例?所有这些我看到处理片段与主要上下文进行获取 - 这将在主线程上完成工作。

1 个答案:

答案 0 :(得分:1)

您似乎正在重新发明NSFetchedResultsController,它将处理您需要的所有内容。你为自己做了不必要的事情。这是一个普遍的需求,Apple为您提供帮助。使用您的获取请求创建NSFetchedResultsController,并实现您的集合视图方法,以根据索引路径询问对象。作为奖励,如果基础数据发生变化,NSFetchedResultsController委托方法可用于更新集合视图。