0

У меня странная ошибка: если я раскомментирую свой NSPredicate, итоговый UITableView пуст.Почему я должен прокомментировать мой NSPredicate, чтобы NSFetchedResultsController заполнил UITableView?

Мои данные модели является следующее: Категория < - >> Лента < - >> Сообщение

Я Извлечение Post с. Post.feed - PostFeed. Feed имеет rssNString Недвижимость.

Вот код:

- (NSFetchedResultsController *)fetchedResultsController { 

     // Set up the fetched results controller if needed. 
     if (_fetchedResultsController == nil) { 
      // Create the fetch request for the entity. 
      NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
      // Edit the entity name as appropriate. 
      NSEntityDescription *entity = [NSEntityDescription entityForName:@"Post" 
                 inManagedObjectContext:_globalMOC]; 
      [fetchRequest setEntity:entity]; 

      // Edit the sort key as appropriate. 
      NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]; 
      NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
      [fetchRequest setSortDescriptors:sortDescriptors]; 

      NSPredicate *predicate =[NSPredicate predicateWithFormat:@"feed.rss == %@", _detailItem.rss]; 
      [fetchRequest setPredicate:predicate]; 

      // Edit the section name key path and cache name if appropriate. 
      // nil for section name key path means "no sections". 
      NSFetchedResultsController *aFetchedResultsController = 
      [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
               managedObjectContext:_globalMOC 
                sectionNameKeyPath:nil 
                  cacheName:nil]; 
      self.fetchedResultsController = aFetchedResultsController; 

      self.fetchedResultsController.delegate = self; 

      NSError *error = nil; 

      if (![self.fetchedResultsController performFetch:&error]) { 
       // Replace this implementation with code to handle the error appropriately. 
       // abort() causes the application to generate a crash log and terminate. 
       // You should not use this function in a shipping application, although it may be useful 
       // during development. If it is not possible to recover from the error, display an alert 
       // panel that instructs the user to quit the application by pressing the Home button. 
       // 
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
       abort(); 
      } 

     } 

     return _fetchedResultsController; 
    } 

Как я уже говорил раньше, я вижу только результаты, если я раскомментировать NSPredicate. Я попытался с LIKE, ==, =, с одинарными и двойными кавычками вокруг %@ ...

BTW, Лучше всего было бы непосредственно сравнить Feed объект ...

Согласно Apple, синтаксис не может будь то проблема, но что тогда?

Post s создаются в отдельном ManagedObjectController, совместно использующем тот же PersistentStoreCoordinator. Я получаю требуемый идентификатор объекта Feed, чтобы связать новый Post с его соответствующим Feed в дочернем MOC (в противном случае я получаю сообщение об ошибке для связывания объектов с разных MOC).

Я также должным образом объединяю свои MOC в основной теме, когда дочерний MOC уведомляет об этом изменения.

В принципе: если я NSLog в Post сек я (комментируемые NSPredicate), я вижу каждый Post с соответствующим RSS Feed URL установки отображаемой Feed (= detailItem).

Кто-нибудь может мне помочь?

+0

Возможный дубликат [Strange bug: раскомментирование NSPredicate в NSFetchedResultsController пуст UITableView] (http://stackoverflow.com/questions/19529511/strange-bug-uncommenting-an-nspredicate-within-nnnsfetchedresultscontroller- wi) –

+0

Вы заметили, что я написал это и другое сообщение? – mirx

ответ

0

Eureka!

Проблема заключалась в следующем: когда я создаю мой NSFetchedResultsController в моем DetailView, _detailItem является nil.

Итак, даже после установки _detailItem, NSPredicate по-прежнему сосредоточен на сравнении отношения моего фида с объектом nil.

Я решил проблему, обновив свою NSFetchedResultsController.fetchRequest в didSelectRowAtIndexPath в MasterView следующим образом:

Feed *feed; 
    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     feed = [_filteredCategoryArray objectAtIndex:indexPath.row]; 
    } else { 
     feed = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 
    } 
    self.detailViewController.detailItem = feed; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"feed == %@", feed]; 
    [self.detailViewController.fetchedResultsController.fetchRequest setPredicate:predicate]; 

Надеется, что это решение может помочь другим людям.

Спасибо за вашу помощь, nickAtStack!

1

Если ваш NSFetchedResultsController пуст, то он уверен, что вы не получаете результатов через запрос на выборку, и я боюсь, из-за неправильной инструкции предиката или отсутствия совпадающих записей. я предполагаю, что проблема связана с наличием шаблона (не знаю много об этом) отметьте NSPredicate Class Reference и Predicate Programming Guide, чтобы получить точные результаты через предикаты.

+0

Я не понимаю, как этот NSPredicate неправильно сформулирован? '' [NSPredicate predicateWithFormat: @ "feed.rss ==% @", _detailItem.rss] '' – mirx

+0

Что именно такое feed.rss? какие типы данных feed.rss и _detailitem.rss – nickAtStack

+0

Hello Nick, feed.rss - это NSString, _detailItem также является объектом (Feed *). Я пробовал с и без кавычек, также с простым и двойным знаком равенства. Я думаю, что проблема как-то кроется в создании (Post *), в NSOperation, объявляющем свой собственный ManagedObjectContext. – mirx

Смежные вопросы