NSFetchResultController para mostrar registros em um Apple Watch?

9

Posso usar NSFetchResultController em um Apple Watch para mostrar 80 a 90 registros na tabela?

Estou usando WKInterfaceTable+IGInterfaceDataTable para usar os métodos de carregamento de tipo de fonte de dados porque isso parece simples do que usar NSArray .

O NSFetchResultController ajudará a aumentar a eficiência ou será lento?

    
por Iqbal Khan 08.04.2015 в 09:38
fonte

3 respostas

1

Descobri que o NSFetchResultController não é útil no aplicativo iWatch porque o WKInterfaceTable não suporta o método delegate para editar, alterar ou excluir uma única linha que o NSFetchResultController suporta no delegate. então você terá que atualizar todos os dados que deseja mostrar a cada vez, então acho que não devemos usá-los.

    
por Iqbal Khan 13.04.2015 / 09:15
fonte
1

Eu usei NSFetchedResultController e WKInterfaceTable para meu aplicativo Apple Watch. É verdade que não é tão conveniente quanto um UITableViewController , mas é muito factível. Eu não tenho nenhum problema de desempenho, mesmo no carregamento de 20 + linhas (não tente 80-90). É claro que isso está no simulador, então não sei como os dispositivos se comportarão.

Inserir, atualizar e excluir você precisa se implementar, mas não é tão difícil.

Abaixo parte do meu código no InterfaceController, com inserir linha como exemplo, mas editar e excluir não é mais difícil:

Interface

...
@property (weak, nonatomic) IBOutlet WKInterfaceTable *interfaceTable;
@property(strong, nonatomic) NSFetchRequest *fetchRequest;
@property(strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
@property(strong, nonatomic) NSMutableArray *data;
...

Implementação

A busca é a mesma de sempre, exceto que não atribuímos um delegado aocontroller de resultados, mas salvamos os dados diretamente:

self.fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"YourModel" inManagedObjectContext:self.managedObjectContext];
self.fetchRequest.entity = entityDescription;

[self.fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"createdAt" ascending:YES]]];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];

[self.fetchedResultsController performFetch:&error];
self.data= self.fetchedResultsController.fetchedObjects;

Eu então uso uma função loadTableData :

- (void)loadTableData {
    [self.interfaceTable setNumberOfRows:[[self data] count] withRowType:@"YourCustomCell"];
    [self.interfaceTable insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:[[self data] count]] withRowType:@"YourRowType"];

    for (int i = 0; i<[[self data] count];i++)
        [self configureRowControllerAtIndex:i];

}

Que chama configureRowControllerAtIndex , uma função que preenche uma linha (tenho dois rótulos):

- (void)configureRowControllerAtIndex:(NSInteger)index {
    WKTableVIewRowController *listItemRowController = [self.interfaceTable rowControllerAtIndex:index];

    [listItemRowController setTitle:[[self.data[index] title] integerValue]];

    [listItemRowController setDescription:[self.data[index] description]];

}

Quando você insere uma nova linha, basta adicioná-la manualmente em managedObjectContext e na matriz de dados:

// Add in managedObjectContext
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"YourModel" inManagedObjectContext:self.managedObjectContext];

YourModel *newRow = [[YourModel  alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil];
// Add in data array
[self.data addObject:newRow];

e salve regularmente o managedObjectContext:

if (![self.managedObjectContext save:&error]) {
    if (error) {
        NSLog(@"Unable to save changes.");
        NSLog(@"%@, %@", error, error.localizedDescription);
    }
}
    
por Wouter 16.04.2015 / 18:24
fonte
0

Obter NSFetchedResultsController trabalhando com WKInterfaceTable é uma PITA. Inferno, mapeando matrizes simples / dicionários de dados para WKInterfaceTable suga. Nós criamos e criamos uma biblioteca simples para tornar isso mais fácil, pelo menos tornando a API semelhante a UITableView . Apenas tive alguma ajuda externa adicionando suporte para NSFetchedResultsController . Espero que isso possa ajudar no futuro!

link

    
por rnystrom 02.06.2015 / 03:45
fonte