O que a Apple quer dizer quando diz que um NSManagedObjectContext pertence ao segmento ou fila que o criou?
Parece que em novembro a Apple atualizou os doisReferência da classe NSManagedObjectContext e aGuia de programação de dados principais documentos para abençoar explicitamente as filas de distribuição GCD e NSOperationQueues em série como mecanismos aceitáveis para sincronizar o acesso a umNSManagedObjectContext
. Mas o conselho deles parece ambíguo e possivelmente contraditório, e quero ter certeza de que o entendi direito.
Anteriormente, a sabedoria aceita parecia ser que umNSManagedObjectContext
só pôde ser acessado a partir do encadeamento que o criou e o uso de uma fila serial para sincronização não foi suficiente; embora as filas seriais executem apenas uma operação por vez, essas operações podem ser potencialmente agendadas em threads diferentes, e um MOC não gosta disso.
Mas agora, a partir do guia de programação, temos:
Você pode usar threads, filas de operação serial ou filas de despacho para simultaneidade. Por uma questão de concisão, este artigo usa "thread" o tempo todo para se referir a qualquer um deles.
Até agora, tudo bem (embora a combinação de threads e filas seja inútil). Para que eu possa usar com segurança um único contexto por fila (serial), em vez de um por operação / bloco, certo? A Apple ainda tem uma representação visual disso nas sessões do Core Data WWDC.
Mas ... onde você cria o contexto para a fila? NoNSManagedObjectContext
documentação, estado Apple:
[Um contexto] assume que o proprietário padrão é o segmento ou fila que o alocou - isso é determinado pelo segmento que chama seu método init. Portanto, você não deve inicializar um contexto em um encadeamento e passá-lo para um encadeamento diferente.
Então agora temos a ideia de umNSManagedObjectContext
precisando saber quem é seu dono. Estou assumindo que isso significa que a primeira operação a ser executada na fila deve criar o MOC e salvar uma referência para as demais operações usarem.
Isto está certo? A única razão pela qual estou hesitante é que oNSManagedObjectContext
o artigo continua dizendo:
Em vez disso, você deve passar uma referência a um coordenador de loja persistente e fazer com que o thread / fila de recebimento crie um novo contexto derivado disso. Se você usar o NSOperation, deverá criar o contexto em main (para uma fila serial) ou start (para uma fila simultânea).
A Apple agora parece estar confundindo operações com as filas que agendam sua execução. Isso me impressiona e me faz pensar se eles realmente querem que você crie um novo MOC para todas as operações, afinal. o que estou perdendo?