私はコアデータを初めて使用し、まだナットとボルトを理解しています.このエラーは何時間も私を悩ませており、解決策を見つけることができないようです. どんな助けでも大歓迎です。
問題はこんな感じ
サーバーからデータをフェッチし、UI を更新する 2 つのビューがあります。私はこのように流れを設定しました
view1 -> サーバーから HTTP Req を送信 - コールバックを受信 -> Coredata にデータを保存 -> Core Data から読み取り、UI に表示 (コールバックと Coredata の保存/読み取りは ViewController で行われます)
view2 -> サーバーから HTTP Req を送信 - コールバックを受信 -> Coredata にデータを保存 -> Core Data から読み取り、UI に表示 (コールバックと Coredata の保存/読み取りは ViewController で行われます)
これは自動更新画面であるため、ビュー 2 はこのプロセスを 3 秒ごとに繰り返します。
問題は、ビュー 1 とビュー 2 をすばやく切り替えようとすると、上記のエラーでアプリがクラッシュすることです。各ビューで数秒間待機すると (サーバーからデータが取得されるのを待機します)、正常に動作します。私は何か間違ったことをしていますか、何を修正する必要がありますか?
- (void) refreshData {
[super refreshData];
[[UserDataFactory sharedSingleton] refreshLoggedInUserDataAndRespondTo:self user:self.user];
}
- (BOOL) refreshDataCallback:(QExtendedHTTPOperation*)responseOperation {
[self saveToCoreData: responseOperation.responseArray];
NSMutableArray *tmp = [[NSMutableArray alloc] initWithArray:[self readFromCoreData]];
[self setData: tmp];
[tmp release];
[self.tableView reloadData];
return YES;
}
- (void) saveToCoreData:(NSArray *) responseArray{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSError *error;
NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
for (NSManagedObject *managedObject in items) {
[self.managedObjectContext deleteObject:managedObject];
}
for (int i=0; i<[responseArray count]; i++) {
CoreView1 *coreView1_ = [NSEntityDescription insertNewObjectForEntityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
coreView_.id = [[responseArray objectAtIndex:i] id];
[self.managedObjectContext insertObject:coreView1_];
}
[self saveContext:self.managedObjectContext];
}
- (NSArray *) readFromCoreData{
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSError *error;
NSMutableArray *fetchedObjects = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
[fetchRequest release];
return [fetchedObjects autorelease];
}
これは私が使用しているサンプル コードです。View2 にも同じコールバックがあり、同じフローに従います。
編集 1 これについて先に言及するのを忘れていました。saveToCoreData メソッドで常にエラーが発生します。また、オブジェクトを削除するコードを削除すると、すべて正常に動作することに注意してください (更新されたデータを保存する前に、テーブルから既存のデータをすべて削除する必要があります)。何が起こっているのかわからない。