SQLite
バッキング ストアを使用するリポジトリ内のサンプル コードに従って、AFIncrementalStore をアプリに組み込む作業を行ってきました。すべての例で、シングルトンの managedObjectContext とNSMainQueueConcurrencyType
.
+ (NSManagedObjectContext *)managedObjectContext {
static NSManagedObjectContext *_managedObjectContext = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
});
return _managedObjectContext;
}
このモックを使用して、フェッチを実行し、それがネットワークからプルされ、sqlite バッキング ストアに格納されることを確認できます。を使用するように変更しようとしましたがNSPrivateQueueConcurrencyType
、ネットワーク リクエストは表示されますが、SQLite
バッキング ストアには何も保存されませんでした。ただし、このモックをメイン キューの同時実行で残し、そこから子を作成し、そのモックを使用すると、すべてが正常に保存されます。
+ (User *)user
{
// grab a user if we already have one
NSManagedObjectContext *managedObjectContext = [VigilCoreDatabase managedObjectContext];
NSManagedObjectContext *tmpContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
tmpContext.parentContext = managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.fetchLimit = 1;
[fetchRequest setAffectedStores:@[ ]];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:tmpContext];
[fetchRequest setEntity:entity];
__block User *user = nil;
[tmpContext performBlockAndWait:^{
NSError *error = nil;
NSArray *fetchedObjects = [tmpContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
NSLog(@"error");
}
if(fetchedObjects.count > 0) {
user = fetchedObjects[0];
}
}];
return user;
}
自分の理解に何かが欠けているかどうかを知りたかったのです。メイン キューの同時実行性を親コンテキストとして (プライベート キュー コンテキストを使用するバッキング ストアを使用して) モックを使用しない例を見つけることができないようですが、同時に、これがが必要か、またはプライベート キュー コンテキストを使用する場合とスタックにメイン キュー コンテキストがある場合に変更を手動で親にプッシュするために何かをする必要があるかどうか。