iPhone Почему только недавно вставленные данные отображаются в моем UITableView, связанном с fetchedResultController? - PullRequest
0 голосов
/ 29 января 2012

Для учебного проекта я создаю приложение, которое позволяет пользователю захватывать изображения и отмечать их.Я использую CoreData для хранения изображений и тегов имен.В приложении я изначально показываю UITable, в котором перечислены все теги с количеством изображений с этим тегом в виде субтитров строки.Существует отдельная часть приложения, где пользователи могут сделать снимок и отметить его одним или несколькими тегами.Фотосъемка и пометка, кажется, работают нормально.Я могу посмотреть в базе данных и увидеть, что все подходит.

Проблема заключается в том, когда я впервые захожу в приложение.Даже если в базе данных есть изображения, в UITableView ничего не отображается.После открытия приложения, если я затем сделаю снимок и добавлю к нему тег, оно отобразится в UITableView - и количество изображений отражает все изображения в базе данных с этим тегом.Другие теги, на которые не ссылается добавленное изображение, НЕ отображаются.Если я сделаю еще одну фотографию и добавлю тег, связанный с другими изображениями, новый тег отобразится в UITableView, и число изображений отражает все изображения с этим тегом.Похоже, что приложение распознает только данные, которые оно увидело (кеш ??), а не всю базу данных.

Я не уверен, какой код наиболее актуален, но я подозреваю, что проблема должна быть связана скак я присоединяю fetchedResultsController к UITableView.Вот код для этой функции, которая вызывается в функции viewDidLoad:

-(void) setupFetchedResultsController
{
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Tag"];
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]];

    MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *managedObjectContext = [appDelegate.imagesDatabase managedObjectContext];
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext: managedObjectContext sectionNameKeyPath:nil cacheName: nil];
}

Я подтвердил, что она вызывается до рендеринга представления.Может кто-то пролить свет на то, что происходит?

Ответы [ 2 ]

0 голосов
/ 29 января 2012

Просто интересно, нужно ли вам использовать NSFetchedResultsController.

Есть ли причина, по которой вы не можете сделать что-то вроде:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Tag"];
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]];

MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *managedObjectContext = [appDelegate.imagesDatabase managedObjectContext];
NSArray *fetchResults = [managedObjectContext executeFetchRequest:request];

А затем просто использовать этот массив в вашем tableViewController дляЗаполните ваш стол ..?

Надеюсь, что это будет вам полезно, если я могу помочь, дайте мне знать:)

0 голосов
/ 29 января 2012

В вашем коде вы не получаете никаких записей.

Вы должны использовать шаблон UIFetchedResultsController, предоставленный шаблонами кода Apple. По сути, вы «лениво» создаете контроллер извлеченных результатов. Затем вы можете удобно установить его на nil, и он будет воссоздан сам, включая выполнение новой выборки с обновленными данными.

-(NSFetchedResultsController*) fetchedResultsController {
    if (fetchedResultsController_ != nil) {
        return fetchedResultsController_;
    }
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Tag" inManagedObjectContext:self.managedObjectContext]];
    [fetchRequest setFetchBatchSize:20];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    self.fetchedResultsController = aFetchedResultsController;
    NSError *error = nil;
    if (![aFetchedResultsController performFetch:&error]) {
        NSLog(@"Error in fetchedResultsController : %@", error); 
    }
    return aFetchedResultsController;
}

Как видите, этот код подразумевает, что вы должны иметь следующие свойства в вашем контроллере вида: managedObjectContext и fetchedResultsController. Получите ссылку на контекст управляемого объекта делегата приложения при создании экземпляра контроллера.

Запустите новый проект в Xcode и выберите «Master-Detail», а затем отметьте «Использовать базовые данные», чтобы получить полный шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...