私のアプリケーションでは、JSONコンテンツを要求を取得し、解析してCoreDataに格納しています。同時に、ユーザーはDBと対話しています(読み書きアクセス)。複数の並列DBアクセスを持つiOS-Appの設計
DBにデータを格納した後、受信したデータに基づいて新しいデータを作成する第2のタスクが開始されます。私はGrand Central Dispatchを使って解析を行い、データをDBに保存します。
私の問題は、GCDを使用するとが得られ、Core Dataのスレッドセーフではないと思われます。他のエラーは、コンテキストperformBlockAndWait
を使用するとデッドロックが発生することです。
GCDとNSMutableContexts
を適切に処理するアプリをデザインするにはどうすればよいですか?
------- EDIT --------
今、私は私がスレッド閉じ込めパターンを使用する必要がポイントにカムコアデータプログラミングガイドを読んでいること。
私のアプリケーションは現在、このように構成されています。それぞれ独自のコンテキストを持つ2つのマネージャがあります。しかし、いくつかのスレッドを使用する場合、3つのスレッドが同じマネージャを呼び出し、1つのコンテキストが同時に3つのスレッドによって使用されることになります。これにより、デッドロックが発生します。この問題を解決するには
私はこのようなのthreadNameでコンテキストを作成するためのアイデアに来た:
- (NSManagedObjectContext *)createManagedObjectContextWithTreadName:(NSString*) threadname {
if([NSThread currentThread].name.length ==0){
[NSThread currentThread].name = threadname;
}
NSManagedObjectContext *context = nil;
context = [self.contextStore objectForKey:threadname];
if(!context){
NSLog(@"Creating context for threadname: %@",threadname);
NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator;
if (coordinator != nil)
{
context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
context.persistentStoreCoordinator = coordinator;
context.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy;
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(mergeChangesFromMOC:) name:NSManagedObjectContextDidSaveNotification object:context];
[self.contextStore setValue:context forKey:threadname];
}
}
return context;
}
は、これは良いアイデアですか?
wow ...あなたはその投稿を愛しています。驚くばかり ! – yunas
ちょうど質問ですが、もはや生きていないスレッドのコンテキストをどうやって削除しますか? –