我正在使用MagicalRecord,並且在我的一個視圖控制器中,數據源使用來自數據庫的數據提供。由於餵養過程包括多個步驟,我嘗試使用GCD來加速整個過程。 一般過程看起來像這樣。MagicalRecord和dispatch_group
在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;
}
編輯: 使用[Entity findAllInContext:privateContext]
讓我獲取所需要的記錄,但它仍然在現在一個實體:(
你確實可以確認'performBlock:'將相對於其他塊並行執行給定塊嗎?我擔心,他們運行序列化。此外,還有一點小小的改進就是使'prepareDataSource:'異步,有一個完成塊,當所有的異步任務(performBlock :)完成時它會被調用。 dispatch_group_wait不必要地導致調用線程阻塞,直到所有任務完成。 – CouchDeveloper
正如Apple在其文檔中聲明的那樣,它是一個異步調用,因此它立即返回。儘管如此,它還是將這個區塊排入私人隊列,並且(我想)會盡可能快地完成工作。但是,因爲這可能包括某種數據庫訪問,所以可能會被序列化。對於你提到的最後一點(group_wait ...),這是我想達到的。在開始使用它之前,我需要完全配置dataSource對象。 –