現在、外部サーバーからダウンロードするプロジェクトを行っています。次に、コア データ データベースに保存される JSON シリアル化を行います。エラーが表示される
*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x69c8a10> was mutated while being enumerated.
これは、データベースのクエリの一部として使用するコード行を指しています。
NSArray *matches = [context executeFetchRequest:request error:&error];
データベースのクエリで使用する完全なコード:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Product"];
request.predicate = [NSPredicate predicateWithFormat:@"product_id = %@", [productInfo objectForKey:@"id"]];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError *error = nil;
NSArray *matches = [context executeFetchRequest:request error:&error];
単一の UIManagedDocument を含むオブジェクトのみを渡します。私はここSOで同じ問題に関してさまざまな投稿を行ってきましたが、多くの人がそれがスレッドの問題であると指摘しました。
ほとんどの場合、彼らは、別々のスレッドにある一種の親子コンテキストを持つことを提案しています。1 つのコンテキストはコンテンツのダウンロードを処理し、もう 1 つのコンテキストは UI を処理するメイン スレッド上にあります。その後、行われた変更は後でマージされます。すでに開始のプロセスに入っていますが、この提案されたソリューションには、 Whitney Young によるこの投稿で述べられているように、多くの問題があるようです。そのような問題がありました、そして私は引用します
- 子コンテキストは祖先をブロックします
- 親コンテキストへの変更は遅くなる可能性があります
- 子コンテキストでフェッチ結果が間違っている
- 保存されていないオブジェクトの子コンテキストでリレーションシップにアクセスできません
- 親コンテキストに変更がある場合、並べ替えは受け入れられません
- NSFetchedResultsController のデッドロック
これらは本当に面倒なことのようです @_@ ので、これを行う方法について他の素晴らしいアイデアを持っている人がいれば、大いに認められるでしょう。ありがとうございます!