我试图迁移一个核心数据数据库领域(介于0-2万行),并且正在到一个死锁时,据我可以告诉,不该”不会发生。串行队列结果的核心数据堆栈中的僵局
从Singleton类,我发起这样的迁移:
_queue = dispatch_queue_create("DiagnosticMigrationQueue", NULL);
dispatch_async(_queue, ^{
_realmMigrator = [[CoreDataToRealmMigrator alloc] init];
[_realmMigrator performMigrationToRealm];
});
内performMigrationToRealm
方法,我建立了核心数据堆栈正是如此:
- (void) performMigrationToRealm
{
self.migrationIsRunning = YES;
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"persistentStore"];
NSError *error;
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
context.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
[context.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"DiagnosticData"
URL:url
options:nil
error:&error];
了解检查 :当我创建队列时,还没有设置Core Data堆栈。因此,NSManagedObjectContext仅在GCD决定放置我的块时创建。
到目前为止,一切都很好。没问题。我现在运行一个方法 - 批量100,000 - 抓取实体中的所有NSManagedObjectIds。它看起来是这样的:
for (NSInteger numberOfMigratedBatches = 0; numberOfMigratedBatches < totalNumberOfBatches; numberOfMigratedBatches++)
{
NSArray *samples = [context executeFetchRequest:fetchRequest error:&error];
if (samples && !error)
{
[self transferWeightSamplesToRealmWithObjectIds:samples withContext:context];
}
[context reset];
fetchRequest.fetchOffset = batchSize * (numberOfMigratedBatches+1);
}
即去时髦的是在上面的代码块fetchRequest
线。尽管我已经发起了一个串行队列这个过程中,我莫名其妙地结束了这一点:
每个那些被卡在同一行的代码,即上述fetchRequest
minion_duties2线程。
这是怎么回事?我明白队列!=线程,并且GDC会将我的代码放在任何适合的线程上。但是,我不希望它会将我的代码放在三个线程上。另外,什么是com.apple.root.user-initiated-qos.overcommit?我会说这是过度承诺。我只希望这个代码运行一次!
据我所知,你的代码看起来很好。如果我不得不猜测,我会说:这是几个不同的fetchRequests试图在几个不同的线程上执行,可能导致死锁。是否有任何理由你手动进行批处理,而不是让Core Data通过在NSFetchRequest上设置fetchBatchSize属性来完成它? – 2015-04-01 07:06:39
恩..可能是我的一个疏忽。我还没有做过很多需要批处理的fetchRequests,所以我没有意识到Core Data可以为我做到这一点。 – churowa 2015-04-02 20:49:22