Pergunta

Eu tenho uma classe de controlador de tabela que usa um controlador de resultados buscado para exibir uma lista de entidades 'pacientes' retiradas de um modelo de dados principal. As seções desta tabela são retiradas de um atributo do paciente chamado 'localização'. Aqui está o descritor de classificação para a solicitação de busca:

NSSortDescriptor *locationDescriptor = [[NSSortDescriptor alloc] initWithKey:@"location" ascending:YES];
NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:locationDescriptor, lastNameDescriptor, nil];

Aqui está o código de inicialização para o FRC:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"location" cacheName:@"List"];

Quando quero adicionar uma nova entidade 'paciente' - clico em um botão Adicionar que empurre um controlador de exibição 'Adicionar um novo paciente' à pilha de navegação.

O primeiro paciente que adiciono funciona bem.

Se eu adicionar um segundo paciente - o aplicativo às vezes falhará com o seguinte erro:

2010-03-22 14: 42: 05.270 Pacientes [1126: 207] Erro grave de aplicação. A exceção foi capturada durante o processamento principal da mudança de dados: *-[NSCFARRAY insertObject: ATIndex:]: Índice (1) Além dos limites (1) com UserInfo (NULL) 2010-03-22 14: 42: 05.272 Pacientes [1126: 207] * Terminando o aplicativo devido à exceção não capturada 'NSRangeException', razão: '*** -[NSCFARRAY insertObject: ATIndex:]: Índice (1) além dos limites (1)'

Isso só parece acontecer se o paciente tiver um local adicionado (se nenhum for adicionado, o local padrão é 'desconhecido'). Parece ter algo a ver com a classificação da localização também. Por exemplo, se a primeira localização do paciente = ala 14 e a segunda = ala 9, ela trava sem falhar.

Estou me perguntando se isso tem algo a ver com a forma como estou pedindo ao controlador de resultados buscado que classifique os nomes da seção?

Esse bug está me deixando louco e eu simplesmente não consigo descobrir. Qualquer ajuda seria muito apreciada!

Foi útil?

Solução

Isso parece ser um bug no código da Apple. Eu tive algum sucesso usando isto Subclasse SafeFetchEdResultScontroller.

Outras dicas

Sempre que você vê a mensagem "A exceção foi capturada durante o processamento principal de alteração de dados" ao usar o NSFetchedResultScontroller, você deve começar imediatamente a olhar para os métodos NSFetchedResultScontrollerDelegate. Eu recomendo definir um ponto de interrupção no início do controlador: DidCangeObject: AtIndexPath: ForChangeType: NewIndexpath Method. Em seguida, passe por esse método e observe onde o acidente está ocorrendo. O problema pode ser que você não está gerenciando a inserção e as exclusões da seção corretamente neste método.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top