- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些代码可以将类(class)下载为 JSON、解析它们并将它们放入核心数据中。然后将它们显示在 UITableView 中。目前,当用户有很多类(class)时,连接有时会超时。因此,我试图在类(class)进入时解析类(class)(使用 SBJson),并一次将它们添加到 tableview 中。
两者的代码基本相同,但是新的代码导致tableView的东西启动时崩溃,并报错
"Terminating app due to uncaught exception
'NSObjectInaccessibleException', reason: 'The NSManagedObject with ID:0x5ad0570 <x-coredata://A21AC71F-175B-423D-BF7D-C67BEE094460/Lessons/p18> has been invalidated.'"
NSMutableArray *tempListArray = [[NSMutableArray alloc] initWithArray:jsonStreamedData];
if (listViewArray)
[listViewArray release];
listViewArray = [[NSMutableArray alloc] init];
if(![tempListArray count]){
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Message" message:@"No active lessons " delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alertView show];
[alertView release];
}
else {
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
NSError *error = nil;
[appDelegate.managedObjectContext reset];
NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;
for (int i = 0; i < [tempListArray count]; i++) {
NSFetchRequest *checkRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *lessonEntity = [NSEntityDescription entityForName:@"Lessons" inManagedObjectContext:managedObjectContext];
[checkRequest setEntity:lessonEntity];
NSPredicate *langPredicate = [NSPredicate predicateWithFormat:@"(language = %@)", appDelegate.currentLanguage];
NSPredicate *userPredicate = [NSPredicate predicateWithFormat:@"(username = %@)", appDelegate.userName];
NSPredicate *idPredicate = [NSPredicate predicateWithFormat:@"(content_Id = %@)", [[tempListArray objectAtIndex:i] valueForKey:@"id"]];
[checkRequest setPredicate:[NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:langPredicate, userPredicate, idPredicate, nil]]];
NSArray *checkResults = [managedObjectContext executeFetchRequest:checkRequest error:&error];
[checkRequest release];
NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init];
if ([checkResults count]) {
Lessons *lessonObj = [checkResults objectAtIndex:0];
lessonObj.cards_count = [[tempListArray objectAtIndex:i] valueForKey:@"cards_count"];
lessonObj.mTitle = [[tempListArray objectAtIndex:i] valueForKey:@"title"];
lessonObj.sound_Url = [[tempListArray objectAtIndex:i] valueForKey:@"audio_url"];
lessonObj.mId = [NSNumber numberWithInt:i];
[tempDict setValue:lessonObj forKey:@"lesson"];
[tempDict setValue: [[tempListArray objectAtIndex:i] objectForKey:@"image_url"] forKey:@"image_url"];
[listViewArray addObject:tempDict];
}
else {
Lessons *newLesson = (Lessons *)[NSEntityDescription insertNewObjectForEntityForName:@"Lessons" inManagedObjectContext:appDelegate.managedObjectContext];
newLesson.cards_count = [[tempListArray objectAtIndex:i] valueForKey:@"cards_count"];
newLesson.mTitle = [[tempListArray objectAtIndex:i] valueForKey:@"title"];
newLesson.sound_Url = [[tempListArray objectAtIndex:i] valueForKey:@"audio_url"];
newLesson.content_Id = [[tempListArray objectAtIndex:i] valueForKey:@"id"];
newLesson.username = appDelegate.userName;
newLesson.language = appDelegate.currentLanguage;
newLesson.mId = [NSNumber numberWithInt:i];
[tempDict setValue:newLesson forKey:@"lesson"];
[tempDict setValue: [[tempListArray objectAtIndex:i] objectForKey:@"image_url"] forKey:@"image_url"];
[listViewArray addObject:tempDict];
}
[tempDict release];
tempDict = nil;
}
if (![appDelegate.managedObjectContext save:&error]) {
NSLog(@"Core Data Error - %@", [error localizedDescription]);
}
// NSMutableArray *tempArray = [NSMutableArray arrayWithArray:listViewArray];
// [listViewArray removeAllObjects];
// [listViewArray addObjectsFromArray:[[tempArray reverseObjectEnumerator] allObjects]];
// tempArray = nil;
}
[tempListArray release];
}
[mListsTableView reloadData];
[jsonStreamedData addObject:dict];
if (!listViewArray)
listViewArray = [[NSMutableArray alloc] init];
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
NSError *error = nil;
[appDelegate.managedObjectContext reset];
NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;
NSFetchRequest *checkRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *lessonEntity = [NSEntityDescription entityForName:@"Lessons" inManagedObjectContext:managedObjectContext];
[checkRequest setEntity:lessonEntity];
NSPredicate *langPredicate = [NSPredicate predicateWithFormat:@"(language = %@)", appDelegate.currentLanguage];
NSPredicate *userPredicate = [NSPredicate predicateWithFormat:@"(username = %@)", appDelegate.userName];
NSPredicate *idPredicate = [NSPredicate predicateWithFormat:@"(content_Id = %@)", [dict valueForKey:@"id"]];
[checkRequest setPredicate:[NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:langPredicate, userPredicate, idPredicate, nil]]];
NSArray *checkResults = [managedObjectContext executeFetchRequest:checkRequest error:&error];
[checkRequest release];
NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init];
if ([checkResults count]) {
Lessons *lessonObj = [checkResults objectAtIndex:0];
lessonObj.cards_count = [dict valueForKey:@"cards_count"];
lessonObj.mTitle = [dict valueForKey:@"title"];
lessonObj.sound_Url = [dict valueForKey:@"audio_url"];
lessonObj.mId = [NSNumber numberWithInt:jsonStreamedData.count - 1]; // This should be equivalent to i from the loop in the first code
[tempDict setValue:lessonObj forKey:@"lesson"];
[tempDict setValue: [dict objectForKey:@"image_url"] forKey:@"image_url"];
[listViewArray addObject:tempDict];
}
else {
Lessons *newLesson = (Lessons *)[NSEntityDescription insertNewObjectForEntityForName:@"Lessons" inManagedObjectContext:appDelegate.managedObjectContext];
newLesson.cards_count = [dict valueForKey:@"cards_count"];
newLesson.mTitle = [dict valueForKey:@"title"];
newLesson.sound_Url = [dict valueForKey:@"audio_url"];
newLesson.content_Id = [dict valueForKey:@"id"];
newLesson.username = appDelegate.userName;
newLesson.language = appDelegate.currentLanguage;
newLesson.mId = [NSNumber numberWithInt:jsonStreamedData.count - 1];
[tempDict setValue:newLesson forKey:@"lesson"];
[tempDict setValue: [dict objectForKey:@"image_url"] forKey:@"image_url"];
[listViewArray addObject:tempDict];
}
[tempDict release];
tempDict = nil;
if (![appDelegate.managedObjectContext save:&error]) {
ALog(@"Core Data Error - %@", [error localizedDescription]);
}
// NSMutableArray *tempArray = [NSMutableArray arrayWithArray:listViewArray];
// [listViewArray removeAllObjects];
// [listViewArray addObjectsFromArray:[[tempArray reverseObjectEnumerator] allObjects]];
// tempArray = nil;
//[self getListsLocally];
[mListsTableView reloadData];
titleLabel.text = [[[listViewArray objectAtIndex:indexPath.row] valueForKey:@"lesson"] valueForKey:@"mTitle"]; // CRASH!
labelCards.text = [NSString stringWithFormat:@"%@ Cards", [[[listViewArray objectAtIndex:indexPath.row] valueForKey:@"lesson"] valueForKey:@"cards_count"]];
if([[listViewArray objectAtIndex:indexPath.row] objectForKey:@"userImageObj"] == nil){
mImageView.backgroundColor = [UIColor grayColor];
if ([[listViewArray objectAtIndex:indexPath.row] objectForKey:@"isThreadLaunched"] == nil) {
[NSThread detachNewThreadSelector:@selector(loadImagesInBackground:) toTarget:self withObject:[NSNumber numberWithInt:indexPath.row]];
[[listViewArray objectAtIndex:indexPath.row] setObject:@"Yes" forKey:@"isThreadLaunched"];
}
}else {
mImageView.image = [[listViewArray objectAtIndex:indexPath.row] objectForKey:@"userImageObj"];
}
最佳答案
当您调用 reset
时,最有可能发生对象失效。在运行 fetch 之前在 managedObjectContext 上。调用reset
使内存中的对象无效,但在保存之前不会删除它们。如果一个无效的托管对象被另一个对象(例如数组)保留,那么它将在保存后以无效的形式持续存在。当您运行提取时,提取返回无效对象,当您尝试访问它们的属性之一时会导致错误reset
与撤消管理器一起使用时会被调用。它不是通用的“删除上下文”调用。如果要删除现有对象,则需要获取它们并显式删除它们。
您的代码还有其他一些问题。您调用release
在 checkRequest
即使您没有创建数组。这可能会导致数组随机消失。 listViewArray
也是如此似乎是一个类属性,但您从不使用访问器形式,例如self.listViewArray
以确保适当的保留。
关于iphone - 核心数据 NSObjectInaccessibleException NSManagedObject 已失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7221561/
我的iPhone应用程序在什么时候崩溃,而我却不知道如何解决。 我有一个辅助线程进行一些清理(删除对象)。如苹果建议在另一个线程中执行操作时,此清理是在第二个NSManagedObjectContex
我有一些代码可以将类(class)下载为 JSON、解析它们并将它们放入核心数据中。然后将它们显示在 UITableView 中。目前,当用户有很多类(class)时,连接有时会超时。因此,我试图在类
我正在开发一个应用程序,其中有一个自定义选项卡栏打开不同的表格 View 。 TableView 的信息由 JSON 远程源提供。并使用自定义 nsmanagementobject 保存到 Core
我看到有人问过这个问题,但所有答案似乎都指向原因是在删除上下文时尝试更新对象。我不认为我正在这样做,但我收到了错误,所以我很困惑(诚然,我在管理保留和引用开始时不稳定)。 我有一个实体,它以本质上是键
我正在使用 RestKit 从我的 RoR 服务中获取对象,并使用 CoreData 来保存一些对象(更多静态类型的查找表对象)。 TasteTag 是那些持久对象之一: #ifdef RESTKIT
Core Data 允许我保存,但是当我尝试删除该对象时,出现以下错误: *** Terminating app due to uncaught exception 'NSObjectInaccess
我有点在我的应用程序中实现了一个今天的 View 扩展与 CoreData 共享,我有多个问题(比如当我有三个对象时只显示一个对象)和一个大问题,“由于未捕获的异常‘NSObjectInaccessi
我的 iOS 应用程序通过多线程使用核心数据。我收到一些包含以下消息的崩溃报告:“'NSObjectInaccessibleException',原因:'CoreData 无法为'0x1e07a9b0
我是 Core data 的新手,仍在弄清楚具体细节,这个错误困扰了我几个小时,我似乎找不到解决方案。非常感谢任何帮助。 问题是这样的 我有两个 View ,它们从服务器获取数据并更新 UI。我是这样
代码在 iOS5+ 中运行良好: NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"FooBar"]; re
我只是遇到了这个错误,我在堆栈溢出上搜索了一个答案,但所有的答案都是模棱两可的,我只是想知道这个堆栈的行在哪里,它表明我有一个错误,我到底应该怎么做解决这个问题 ? *** Terminating a
我有一个正在努力寻找的错误。我相信发生的事情是,我正在从底层数据库中删除一个对象,而另一个托管对象上下文(在另一个线程中)有一个错误,并在尝试执行错误时收到“NSObjectInaccessibleE
我是一名优秀的程序员,十分优秀!