Impedindo uma referência NSManagedObject atualizando um UITableViewCell
Informações de fundo:
Temos um aplicativo que preenche visualizações de tabela do Core Data. Este aplicativo possui um mecanismo de sincronização implementado que atualiza os dados do CoreData em um contexto em segundo plano e é automaticamente mesclado novamente ao contexto principal quando terminar.
Para manter o exemplo simples, vamos assumir umaMessage
e umComment
'entidade' onde uma Mensagem pode ter zero ou mais Comentários. SubclassificamosNSManagedObjects
para todas as nossas entidades e, portanto, temos uma propriedade chamadacomments
(que é do tipoSet<Comment>
) no nossoMessage
classe.
Um requisito do aplicativo é que uma visualização possasó atualize os dados na tela ao navegar para uma nova tela. Isso significa que, quando você estiver na tela e qualquer atualização de dados em segundo plano, os dados visíveis permanecerão osmesmo.
NossoMessageViewcontroller
tem uma propriedade privadamessage
que é preenchido emviewDidLoad
. DentrocellForRowAt indexPath
nós usamoscell.message = message.comments[indexPath.row]
.
Problema:
O problema é que, se atualizamos um comentário em nosso contexto de segundo plano, que é mesclado de volta ao contexto principal, 'rolando' para cima e para baixo na visualização de tabela (acionando ocellForRowAt indexPath
novamente) atualizará a célula com o texto atualizado.
Isso faz sentido porque nossamessage
A propriedade é uma referência que representa os dados em nossos CoreData.
Pergunta, questão:
Como evito omessage
variável da atualização? Ou, de maneira diferente: como posso manter um 'instantâneo' de um objeto de mensagem (e seus relacionamentos) ao carregar o controlador de exibição?
Solução?
A única solução que acho que poderia funcionar é criar uma estrutura com as mesmas propriedades e preenchê-la ao carregar a exibição. Eu realmente não gosto dessa abordagem porque nosso modelo é muito mais complicado do que issoMessage
exemplo e tem muitos relacionamentos, recursão etc.