NSFetchedResultsController没有收到新对象

时间:2013-01-12 07:52:30

标签: ios xcode core-data nsfetchedresultscontroller

我正在尝试更新名为“HomeViewController”的视图中的UITableView,以显示我添加的新对象。但是在我创建新的NSFetchedResultsController后,- (void)saveNewShindyToDatabaseForName:(NSString *)name details:(NSString *)details dateAndTime:(NSDate *)dateAndTime location:(CLLocation *)location timePosted:(NSDate *)postedTime { if (!self.shindysDatabase) { NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; self.shindysDatabase = [[UIManagedDocument alloc] initWithFileURL:url]; } dispatch_queue_t saveQ = dispatch_queue_create("Shindy Creator", nil); dispatch_async(saveQ, ^{ [self.shindysDatabase.managedObjectContext performBlock:^{ [Shindy setupShindyForSaveToDatabaseForName:name details:details dateAndTime:dateAndTime location:location timePosted:postedTime inManagedObjectcontext:self.shindysDatabase.managedObjectContext]; }]; }); NSError *error = nil; if (![self.shindysDatabase.managedObjectContext save:&error]) { NSLog(@"%@", error.userInfo); } } - (void)setupFetchedResultsController { NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Shindy"]; NSSortDescriptor *nameSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; NSSortDescriptor *photoSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"photo" ascending:YES]; NSSortDescriptor *detailSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"details" ascending:YES]; NSSortDescriptor *dateAndTimeSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"dateAndTime" ascending:YES]; NSSortDescriptor *timePostedSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"timePosted" ascending:YES]; request.sortDescriptors = [NSArray arrayWithObjects:nameSortDescriptor, photoSortDescriptor, detailSortDescriptor, dateAndTimeSortDescriptor, timePostedSortDescriptor, nil]; self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.shindysDatabase.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; } 没有更新。我在各种文档中都有以下代码:

HomeViewController.h

NSManagedObject

Shindy + SQL.m(实体的+ (Shindy *)setupShindyForSaveToDatabaseForName:(NSString *)name details:(NSString *)details dateAndTime:(NSDate *)dateAndTime location:(CLLocation *)location timePosted:(NSDate *)postedTime inManagedObjectcontext:(NSManagedObjectContext *)context { Shindy *shindy = [NSEntityDescription insertNewObjectForEntityForName:@"Shindy" inManagedObjectContext:context]; __block NSString *nameString = name; __block FBProfilePictureView *profileImage = nil; if (FBSession.activeSession.isOpen) { [[FBRequest requestForMe] startWithCompletionHandler: ^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) { if (!error) { nameString = user.name; profileImage.profileID = user.id; } }]; } NSData *imageData = nil; for (NSObject *obj in [profileImage subviews]) { if ([obj isMemberOfClass:[UIImageView class]]) { UIImageView *objImg = (UIImageView *)obj; imageData = UIImagePNGRepresentation(objImg.image);; break; } } shindy.name = name; shindy.dateAndTime = dateAndTime; shindy.timePosted = postedTime; shindy.details = details; shindy.photo = imageData; return shindy; } 子类,“Shindy”)

- (void)setupFetchedResultsController:

最初加载视图时调用方法viewDidLoad(但不在viewWillAppear- (void)saveNewShindyToDatabaseForName:方法中)。一旦用户输入完数据,我的NSManagedObjectContext函数就会在一个单独的视图控制器中调用。换句话说,它是公共API,但HomeViewController仍然在NSLog内用于委派。代表们和&amp;我的代码的数据源设置正确。

我试图逼迫各种取物;是通过managedObjectContext还是fetchedResultsController。我还在代码的不同位置设置了HomeViewController,以确保数据通过NSLog。我还设置了另一个nil以确保fetchedResultsController和amp; managedObjectContext不是NSSortDescriptor

似乎所有内容都已检出,我的代码中的其他默认错误也没有出现任何错误。

我担心这必须对我- (void)setupFetchedResultsController:方法中的- (void)saveNewShindyToDatabaseForName:做一些事情,但我也尝试以各种方式配置它们无济于事。与我的managedObjectContext&amp;有明确的联系。我的fetchedResultsController也是如此,所以这不是问题所在。

我已经完成了一些尝试。也许,这里有人有一些见解。

对于jrturton ......

我已经在- (void)saveNewShindyToDatabaseForName:(NSString *)name details:(NSString *)details dateAndTime:(NSDate *)dateAndTime location:(CLLocation *)location timePosted:(NSDate *)postedTime { // All of the code originally in this method is here... if ([self.fetchedResultsController managedObjectContext] == self.shindysDatabase.managedObjectContext) { NSLog(@"MOC's are the same."); } NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Shindy"]; NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"details" ascending:YES]; request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; NSError *error = nil; NSArray *detailsArray = [self.shindysDatabase.managedObjectContext executeFetchRequest:request error:&error]; if (error) { NSLog(@"error: %@", error.userInfo); } NSLog(@"details: %@", detailsArray); } 方法中在最初的所有代码之后实现了以下代码。它看起来像这样:

{{1}}

所有这一切回归的是,为了回答你的第二个可能答案,MOC肯定是一样的。但是,似乎新对象实际上并未保存到Core Data中。或者我不会把它们拉回来。

我能想到记录核心数据内部而不会出现无法识别的选择器错误的唯一方法是为正确的实体创建新请求,然后执行获取,然后记录该获取的结果,在这种情况下,什么也没有返回。

我将假设我的问题出在我的代码中,而不是将新对象保存到Core Data。有了这个说,你可以识别我没有正确地将这些对象保存到我的上下文的任何地方,以便它可以放入我的核心数据模型以便以后检索吗?或者我是否需要设置一个不同的方法,而不是请求记录保存到我的核心数据中的内容?

1 个答案:

答案 0 :(得分:2)

可能的问题:

  1. 没有获取结果控制器委托(确定,根据评论解决)。
  2. 在拥有数据库之前可能正在设置FRC(您在第一个方法中创建了一个新数据库,但是在此之前设置了FRC - 它们是否具有相同的MOC对象?
  3. 多线程地狱 - 您的MOC保存调用将在调用调用通过完成块的方法(p!)的方法的块之前执行。这很可能导致通知无法赶上。
  4. 您没有提及新对象是否曾进入数据库 - 如果您保存,关闭并重新打开应用程序,它们是否存在?我们是在处理未能发送或接收更改通知,还是未能进行更改?