NSSortDescriptorを使用してさまざまな属性でソートを実行した後、ソート順をキャプチャしてコアデータに戻したいと思います。 uXを安定して保つために、別のMOCを使用してバックグラウンドでこれを実行しようとしています。しかし、おそらくいくつかの他のことが起こっているので、列挙されたエラーの間に突然変異が起こっています。サーバーとの同期やフェッチを行うFRCなどです。IOS/Objective-C:バックグラウンドでNSFetchedResultsControllerの後にコアデータに保存
誰かが自分のコードで何が間違っているのを見ることができますか?事前に感謝の意を表します。
-(NSFetchedResultsController *)fetchedResultsController {
//code to carry out fetch
//Sort order specified according to parameters
_theItems =[_fetchedResultsController fetchedObjects];
//at this point fetch should be complete
NSManagedObjectContext *mainMOC = _managedObjectContext;
NSManagedObjectContext*privateContext =[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[privateContext setParentContext:mainMOC];
[privateContext performBlock:^{
for (int i = 0; i < _theItems.count; i++)
{
Items* oneitem = theItems[i];
oneitem.sortorder = i;
}
NSError *error = nil;
if (![privateContext save:&error]) {
NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
abort();
}
[mainMOC performBlockAndWait:^{
NSError *error = nil;
if (![mainMOC save:&error]) {
NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
//abort();
}
else {
_managedObjectContext = mainMOC;
}
}];
}];
mainMOC=nil;
privateContext = nil;
return _fectchedResultsController;
}
編集:アップルのドキュメントから
:
NSArray *jsonArray = …; //JSON data to be imported into Core Data
NSManagedObjectContext *moc = …; //Our primary context on the main queue
NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[private setParentContext:moc];
[private performBlock:^{
for (NSDictionary *jsonObject in jsonArray) {
NSManagedObject *mo = …; //Managed object that matches the incoming JSON structure
//update MO with data from the dictionary
}
NSError *error = nil;
if (![private save:&error]) {
NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
abort();
}
[moc performBlockAndWait:^{
NSError *error = nil;
if (![moc save:&error]) {
NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
abort();
}
}];
}];
編集2:viewdidappear内のコードを配置
は例外を停止しました。さらに、私はコードをフォローするように変更しました。これは動作するように見えます。今はスレッドセーフですか?
for (int i = 0; i < _theItems.count; i++)
{
Items* oneitem = theItems[i];
NSManagedObjectID* oneID = oneitem.objectID;
Items *myItem = [privateContext objectWithID:oneID];
myItem.sortorder = i;
}
私は何かが非常に間違っているのではないかと恐れています。プライベートコンテキストを設定して、一連のオブジェクト(おそらくManagedObjectのサブクラス)を反復処理しているようですが、どこから来たのでしょうか?そのメソッドのバリアントのいずれかでobjectWithIDを使用しているオブジェクトを取得していないので、主コンテキストから取得したオブジェクトを操作している可能性があります(performBlock呼び出し内でこれを行うため、その後、間違ったスレッド上の別のコンテキストからオブジェクトを操作した場合、プライベートコンテキストを保存してみると、それはすべてうまくいくと思います。いいえ。 – TheBasicMind
私はまた、マネージオブジェクトはスレッドセーフではありませんが、オブジェクトIDはobjectwithIDを使用してすべてのマネージオブジェクトを取得する必要があることを読んでいます。しかし、私はまた、NSPrivateQueueConcurrencyTypeがこのプロセスを簡略化したように見えることを読んだので、上記を行うことができます。多分私は間違った思いをするでしょう。参照を検索しようとします。 – user6631314
これは私がドキュメントで読んだものです:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html – user6631314