Pergunta

No meu NSFetchedResultScontroller, eu defino um SortDescriptor que classifique com base na propriedade Data dos meus objetos gerenciados. O problema que encontrei (junto com vários outros, de acordo com o Google) é que os valores nulos são classificados no final mais cedo, e não no final do espectro da data. Quero que minha lista seja classificada mais cedo, mais cedo, mais tarde, mais recente, nil. Pelo que entendi, essa classificação é feita no nível do banco de dados no SQLite e, portanto, não posso construir meu próprio método de comparação: fornecer a classificação que eu quero.

Não quero classificar manualmente na memória, porque teria que desistir de todos os benefícios do NSFetchedResultScontroller. Não posso fazer a classificação composta porque os NameKeypaths de Seção estão fortemente acoplados aos intervalos de data. Eu poderia escrever uma rotina que redireciona as solicitações do IndexPath para que a seção 0 no controlador de resultados seja mapeada para a última seção da TableView, mas temo que isso acrescente muitas vezes, aumentasse severamente a complexidade do meu código e seja muito, muito propenso a erros.

A ideia mais recente que estou considerando é mapear todas as datas da NIL para a data futura mais distante que o NSDATE suporta. Meu cérebro esquerdo odeia essa ideia, pois parece mais um hack. Também será necessário um pouco de trabalho para implementar, já que verificando muito os fatores de como processe datas no meu aplicativo. Não quero seguir esse caminho sem primeiro verificar as melhores opções. Alguém pode pensar em uma maneira melhor de contornar esse problema?

Atualizar

Uma possível maneira possível de contornar esse problema seria mudar para uma loja persistente binária. Pelo que li na documentação, a classificação é feita no Objective-C com a loja persistente binária, para que eu possa fornecer meu próprio método de comparação para a classificação da data. Tenho duas preocupações com essa abordagem. Primeiro, que tipo de performance atingi que vou ver me mudando para uma loja binária? Segundo, como será difícil lançar essa alteração em uma atualização de aplicativos?

Foi útil?

Solução 2

Decidi ir com a correção "hack", porque não queria incorrer na sobrecarga de carregar o gráfico de objeto inteiro na memória que vem com o uso da loja binária. Em vez de armazenar nil quando o usuário não define uma data, eu armazenei o resultado de um método de classe "Node".

Outras dicas

Não sei se é possível alterar para onde as datas do NIL são classificadas no NSFetchedResultScontroller. No entanto, eu tenho uma sugestão de acordo com o seu "hack" de mudar de nil datas para um tempo futuro. Especificamente, eu criaria uma nova propriedade transitória para sua entidade que retorna uma data modificada. Basicamente, o getter personalizado para essa propriedade recuperaria a data e depois verificaria se é nulo. Nesse caso, retornaria a última data futura que o NSDATE suporta. Isso permitiria que o NSFetchedResultScontroller classifique os resultados da maneira que você deseja.

Usando propriedades transitórias é como as listas com seções usando a primeira letra do sobrenome de uma pessoa (a la The Contacts App) são criadas. Um método para fazer isso é descrito aqui.

Por exemplo:

// THIS ATTRIBUTE GETTER GOES IN YOUR OBJECT MODEL FOR THE 
// TRANSIENT PROPERTY modifedDate
- (NSDate *) modifiedDate {
  [self willAccessValueForKey:@"date"];
  NSDate * date = [self date];
  if(date == nil)
    date = // Set as furthest future date.
  [self didAccessValueForKey:@"date"];
  return date;

}

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