iPhone Core Data не обновляет таблицу - PullRequest
3 голосов
/ 29 января 2010

Я пытаюсь написать приложение с Core Data, и мне удалось успешно прочитать и записать в базу данных Core Data. Однако, если я записываю в базу данных в одном контроллере представления, другие мои контроллеры представления не увидят изменения, пока приложение не будет закрыто, а затем снова открыто. Это действительно расстраивает. Я не совсем уверен, как заставить работать метод refresh - (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag. Как получить ссылку на мой управляемый объект?

В любом случае, вот код, который я использую, чтобы прочитать данные обратно. Это в методе viewDidLoad.

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Website" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"siteName" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptors release];

NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if(mutableFetchResults == nil) {
    //Handle the error
}

[self setNewsTitlesArray:mutableFetchResults];
[mutableFetchResults release];
[request release];

[newsSourcesTableView reloadData];

Заранее спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 29 января 2010

Я не совсем уверен, что вы намерены делать из того, что, как я понимаю, вы изменяете контекст управляемого объекта в одном контроллере представления, и вы хотите, чтобы результат был виден в других контроллерах представления, это правильно ?. В любом случае, решение для этого состоит в том, чтобы прослушать NSManagedObjectContextDidSaveNotification (который отправляется, когда контекст сохранен) и зарегистрировать в качестве наблюдателя контроллер представления, на который вы хотите повлиять:

NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
[dnc addObserver:myController selector:@selector(updateTable:) name:NSManagedObjectContextDidSaveNotification object:controller.context];

Таблица обновления в контроллере myController селектора может выглядеть примерно так:

- (void)updateTable:(NSNotification *)saveNotification
{
if (fetchedResultsController == nil)
{
    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) {
    //Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }       
}
else
{
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    // Merging changes causes the fetched results controller to update its results
    [context mergeChangesFromContextDidSaveNotification:saveNotification];  
    [self.tableView reloadData];
}

Надеюсь, это поможет.

-Oscar

0 голосов
/ 25 апреля 2010

На самом деле я обнаружил, что у меня установлена ​​таблица для загрузки в качестве моего вида.Когда я поставил таблицу в другое представление, все работало нормально.

...