我有这个奇怪的问题与更新我的NSManagedObject有关。当我尝试更新其中一个属性时,UITableview中的某个属性会在其中显示,并且当我从Core数据中重新获取时,它只会再次消失。我认为这是由于我如何在另一个线程中获取我的实体内容所致:
[[[DataManager sharedInstance] backgroundManagedObjectContext] performBlock:^{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = [NSEntityDescription entityForName:@"Ret" inManagedObjectContext:[[DataManager sharedInstance] backgroundManagedObjectContext]];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"menu.name == %@ ", self.menu.name];
fetchRequest.resultType = NSManagedObjectIDResultType;
NSArray *results = [[[DataManager sharedInstance] backgroundManagedObjectContext] executeFetchRequest:fetchRequest error:nil];
NSLog(@"%@", [NSThread currentThread]);
dispatch_async(dispatch_get_main_queue(), ^{
[self loadWithObjectIDs:results];
[_theTableview reloadData];
});
}];
这是在viewDidAppear方法中触发的。
然后我的NSFetchResultsController方法更新主线程上的UI:
-(void)loadWithObjectIDs:(NSArray *)objectsIDs {
_theManagedObjectContext = [[DataManager sharedInstance] mainManagedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = [NSEntityDescription entityForName:@"Ret" inManagedObjectContext:_theManagedObjectContext];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SELF IN %@ ", objectsIDs];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
fetchRequest.sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[NSFetchedResultsController deleteCacheWithName:@"dishes"];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_theManagedObjectContext sectionNameKeyPath:nil cacheName:@"dishes"];
_fetchedResultsController.delegate = self;
NSError *error = nil;
if (![_fetchedResultsController performFetch:&error]) {
NSLog(@"Fetch Failed");
}
NSArray *contentsOfFetch = _fetchedResultsController.fetchedObjects;
}
然后在另一个连接到我的UITableViewCell中的按钮的方法中,我更新了我的NSMangedObject的属性:
-(void)addTC:(UIButton *)sender {
//sender.tag equals indexPath.row
NSIndexPath *ip = [NSIndexPath indexPathForRow:sender.tag inSection:0];
Ret *ret = (Ret*)[_fetchedResultsController objectAtIndexPath:ip];
//The Cell disappears if I use this code to update my attribute.
NSInteger amountToUpdate = ret.amount.intValue;
amountToUpdate++;
ret.amount = [NSNumber numberWithInt:amount];
/*Method to Save Main Context: includes:
NSError *error = nil;
if (![context save:&error]) {
}*/
[self saveCurrentContext:_theManagedObjectContext];
}
我如何设法解决这个小问题,因此当我更新其属性时,我的UITableview中的NSManagedObject不会消失?
答案 0 :(得分:1)
我认为使用获取结果控制器(FRC)作为表视图没有任何优势 您的设置中的数据源。 FRC对于自动更新的更改跟踪非常有用 表视图。但这不适用于此,因为实际的提取是在后台完成的 线程和获取的对象被传递(通过对象id)到主线程。
如果托管对象ID是临时ID ,则可能还有问题。如果保存了对象,则id会更改(成为永久ID)。这可以解释为什么对象是 从表格视图中消失。
所以你可以尝试的一件事就是为所有对象调用obtainPermanentIDsForObjects:
将ids传递给主线程之前的后台线程。
或者,您可以执行简单的提取
self.dataSourceArray = [_theManagedObjectContext executeFetchRequest:fetchRequest error:&error];
[self.tableView reloadData];
并将此数组用作表视图数据源。在这种情况下,如果您修改对象,则为您
必要时必须致电reload/insert/deleteRowsAtIndexPaths
。