使用NSFetchedResultsController更新CollectionView

时间:2013-07-10 07:58:51

标签: objective-c xcode nsfetchedresultscontroller nscollectionview

我有一个UICollectionView,需要在模型更改时更新。

订阅通知中心是为了这样做:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(modeloActualizado:) name:NSManagedObjectContextObjectsDidChangeNotification object:self.contexto];
}

UICollectionViewController通过NSFetchedResultsController连接到模型,NSFetchedResultsController用于返回“ocupada”值为1的实体“Plaza”列表(它是一个布尔值)。

-(NSFetchedResultsController*) frController{

    if(_frController == nil){

        NSFetchRequest *request = [[NSFetchRequest alloc]init];
        NSEntityDescription *entidad = [NSEntityDescription entityForName:@"Plaza" inManagedObjectContext:self.contexto];
        request.entity = entidad;
        request.fetchBatchSize = 10;

        // Añadir un predicado para filtrar por plazas ocupadas
        request.predicate = [NSPredicate predicateWithFormat:@"ocupada == 1"];//%@",[NSNumber numberWithBool:YES]];

        // Ordenar por numero de plaza
        NSSortDescriptor *ordenPorNumero = [[NSSortDescriptor alloc] initWithKey:@"numero" ascending:YES];
        NSArray *descriptores = [[NSArray alloc] initWithObjects:ordenPorNumero, nil];
        [request setSortDescriptors:descriptores];

        // Crear el FetchedResultsController
        //[NSFetchedResultsController deleteCacheWithName:@"Coleccion"];
        _frController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.contexto sectionNameKeyPath:nil cacheName:@"Coleccion"];
        _frController.delegate = self;

        NSError *error = nil;
        if(![self.frController performFetch:&error]){
            NSLog(@"Ha ocurrido un error: %@ %@",error,[error userInfo]);
            abort();
        }
    }

    return _frController;

}

模型更改时调用的方法会重新加载CollectionView数据:

-(void)modeloActualizado:(NSNotification *) notificacion{
    [self.collectionView reloadData];
}

问题是,如果我更改了实体的任何值,那些更改会显示在CollectionView中,但是如果我将实体布尔值“ocupada”更改为NO,它仍会出现在CollectionView中直到App关闭并再次打开。

我做错了吗?我不知道为什么NSFetchedResultsController返回相同数量的对象,即使其中一个对象不再与谓词条件匹配。

有什么想法吗?

提前致谢。

0 个答案:

没有答案