マルチスレッドとコア データを使用してサンプル アプリを作成しようとしていますが、これはクラッシュするかデッドロック状態になると思われます。
同時キューを作成し、for ループ呼び出しの dispatch_async を 3 回使用しました。
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *aMangedObjectContext = appDelegate.managedObjectContext;
for (int i = 0; i<=2; i++) {
LibXMLParser *parser = [[parserClass alloc] init];
parser.delegate = self;
dispatch_async(_queue, ^{
[parser startWithContext:aMangedObjectContext];
});
}
//クラッシュするかどうかを確認するためだけに別の同時キューを追加しましたが、うまくいきませんでした
for (int i = 0; i<=2; i++) {
LibXMLParser *parser = [[parserClass alloc] init];
parser.delegate = self;
dispatch_async(dispatch_get_main_queue(), ^{
[parser startWithContext:aMangedObjectContext];
});
}
この手法を使用して同時キューを作成します。
@property (nonatomic) dispatch_queue_t queue;
@property (nonatomic) dispatch_queue_t queue;
_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
メインコンテキストでデータを保存します:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *aMangedObjectContext = appDelegate.managedObjectContext;
NSError *error = nil;
if (![aManagedObjectContext save:&error]) {
NSLog(@"Error in adding a new bank %@, %@", error, [error userInfo]);
abort();
}
ここでは、アプリのデリゲートで作成された同じメイン コンテキストを異なるスレッドで使用しています。これはコア データの包含モデルを壊すため (各スレッドには独自のプライベート コンテキストが必要です)、アプリは適切な出力を生成しません。
アプリは、dispatch_async ごとに上位 100 曲を取得します。だから全部で300曲手に入る。
複数ではなくメインコンテキストのみを使用したため、アプリを NSManagedObjectContextDidSaveNotification にも登録していません。save が呼び出されるたびに、メインコンテキスト自体の異なるスレッドで呼び出されます。
アプリがデッドロック状態でもクラッシュしていない理由もわかりません。
どこが間違っているのか教えてください。
あるコンテキストを別のスレッドで使用しているときに、複数のスレッドで同じオブジェクト コンテキストを使用すると、アプリがクラッシュまたはフリーズするようにしたいだけです。
どのような場合にキューが同じコンテキストに同時にアクセスするのか教えてもらえますか?別の同時キューを作成する必要がありますか? 私はそれを試しましたが、うまくいきませんでした。
ありがとうございました。