私は MagicalRecord を使用しています。ビュー コントローラーの 1 つで、データ ソースはデータベースからのデータをフィードします。給餌プロセスには複数のステップが含まれているため、GCD を使用してプロセス全体をスピードアップしようとしました。一般的なプロセスはそのように見えます。
globalSummary でアクセス プロパティを取得した後に行う作業。問題は、アプリが dispatch_group_wait でハングすることです。ステップに作業を追加しようとしましたが、最初は機能しますが、さらに作業を追加すると、コードを段階的に実行すると機能しますが、実行すると機能しません。
アプローチに何か問題がありますか、それとも何らかの形で MagicalRecord と競合しますか?
- (NSArray *)dataSource
{
if (_dataSource == nil) {
_dataSource = [NSMutableArray array];
NSManagedObjectContext *privateContext = [NSManagedObjectContext contextWithStoreCoordinator:[NSPersistentStoreCoordinator defaultStoreCoordinator]];
GlobalSummary *globalSummary = [GlobalSummary insertInManagedObjectContext:privateContext]; // holds a bunch of fetched properties
dispatch_queue_t queue = dispatch_queue_create("de.berndrabe.dataSource", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t outerGroup = dispatch_group_create();
__block SectionInfo *siPilotAircraft = nil;
if ([PilotAircraft countOfEntities]) {
dispatch_group_async(outerGroup, queue, ^{
NSArray *frPilotAircraft = [PilotAircraft findAll];
// do some processing an set SectionInfo variable
});
}
__block SectionInfo *siMedicals = nil;
if ([PilotMedical countOfEntities]) {
dispatch_group_async(outerGroup, queue, ^{
NSArray *frPilotMedical = [PilotMedical findAll];
});
}
// more working packets following the same patter
dispatch_group_wait(outerGroup, DISPATCH_TIME_FOREVER);
if (siPilotAircraft.countOfRows) {
[_dataSource addObject:siPilotAircraft];
}
if (siMedicals.countOfRows) {
[_dataSource addObject:siMedicals];
}
}
return _dataSource;
}
編集: Lets を使用[Entity findAllInContext:privateContext]
すると、必要なレコードを取得できますが、1 つのエンティティで障害のある関係にアクセスするときにスタックしてしまいました :(