如果我在核心数据存储中有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
- 我是否有这种方法的完整示例?所有这些我看到处理片段与主要上下文进行获取 - 这将在主线程上完成工作。
答案 0 :(得分:1)
您似乎正在重新发明NSFetchedResultsController
,它将处理您需要的所有内容。你为自己做了不必要的事情。这是一个普遍的需求,Apple为您提供帮助。使用您的获取请求创建NSFetchedResultsController
,并实现您的集合视图方法,以根据索引路径询问对象。作为奖励,如果基础数据发生变化,NSFetchedResultsController
委托方法可用于更新集合视图。