2011-01-19 13 views
7

複数のスレッドでCore Dataを使用していることについては、NSManagedObjectContext複数のインスタンスを使用してNSPersistentStoreCoordinatorを共有することについて話しました。これは理解されており、UIのサポートでメインスレッドでコアデータを使用し、実行に時間がかかるバックグラウンドフェッチ操作があるアプリで動作させました。複数のNSPersistentStoreCoordinatorインスタンスを同じ基本SQLite永続ストアに接続できますか?

基本的なSQLite永続ストアへのアクセスがNSPersistentStoreCoordinatorでシリアル化されているため、バックグラウンドフェッチ操作でUIがブロックされることがあります。

バックグラウンドフェッチ操作では、データは更新されず、データの読み取りのみが行われます。同じ基本SQLite永続ストアに接続されたバックグラウンドスレッドに、完全に並列なコアデータスタック(NSManagedObjectContextNSManagedPersistentStoreCoordinator、およびNSManagedObjectModel)を設定できますか?これは、UIスレッドとバックグラウンドフェッチオペレーションの間に完全な並行性を与えるようです。

答えて

6

これに私自身の暫定的な答えは今はいです。

NSPersistentStoreインスタンスを渡してバックグラウンド操作を初期化します。バックグラウンドスレッドでは、URLを含むこのストアのプロパティは、まったく新しいコアデータを作成するために使用されている。このようにスタック:

// create managed object model 
    NSURL *modelUrl = [[NSBundle bundleForClass:[self class]] URLForResource:@"..." withExtension:@"..."]; 
    NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl]; 

    // create persistent store coordinator 
    NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel]; 
    NSError *error = nil; 
    [persistentStoreCoordinator addPersistentStoreWithType:[store type] 
              configuration:[store configurationName] 
                 URL:[store URL] 
                options:[store options] 
                error:&error]; 

    // create managed object context 
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init]; 
    [context setPersistentStoreCoordinator:persistentStoreCoordinator]; 
    [persistentStoreCoordinator release]; 
    [managedObjectModel release]; 

私は、背景が、この新しく作成されたNSManagedObjectContextインスタンスを使用してフェッチを実行します。

すべてがうまくいくようです。私は自分の答えを受け入れているわけではありませんが、誰かに私の調査結果に裏づけや矛盾する証拠を提供させたいと思っています。

+0

こんにちは、これはまだあなたのためにうまくいきますか?私はこれのような何かをする必要がありますが、私はオンラインで答えを見つけていません。 – jasongregori

+0

私は今までこの方法で何の問題も持っていませんでした。 – GBegen

+0

私が理解しているように、SQLiteは複数の並行リーダと1つのライタをサポートしています。したがって、各NSPersistentStoreCoordinatorはリーダーになるため、完全に可能です。 –

関連する問題