Ei, estou trabalhando na camada do modelo para nosso aplicativo aqui.
Alguns dos requisitos são assim:
- Deve funcionar no iPhone OS 3.0+.
- A fonte de nossos dados é um aplicativo RESTful Rails.
- Devemos armazenar os dados em cache localmente usando Core Data.
- O código do cliente (nossos controladores de UI) deve ter o mínimo de conhecimento possível sobre qualquer coisa de rede e deve consultar / atualizar o modelo com a API Core Data.
Verifiquei a Sessão 117 do WWDC10 sobre como criar uma experiência do usuário orientada para o servidor, passei algum tempo verificando o recurso objetivo , o recurso principal e frameworks RestfulCoreData .
A estrutura do Objective Resource não se comunica com os Core Data por conta própria e é apenas uma implementação de cliente REST. O Core Resource e RestfulCoreData presumem que você fala com Core Data em seu código e eles resolvem todas as porcas e parafusos no plano de fundo na camada do modelo.
Tudo parece bem até agora e, inicialmente, pensei que o Core Resource ou o RestfulCoreData cobririam todos os requisitos acima, mas ... Há algumas coisas que nenhum deles aparentemente resolveu corretamente:
- O thread principal não deve ser bloqueado ao salvar atualizações locais no servidor.
- Se a operação de salvamento falhar, o erro deve ser propagado para a IU e nenhuma alteração deve ser salva no armazenamento local de Core Data.
Recurso central passa a emitir todos os seus pedidos para o servidor quando você chama - (BOOL)save:(NSError **)error
seu Contexto de Objeto Gerenciado e, portanto, é capaz de fornecer uma instância NSError correta das solicitações subjacentes para o servidor falhar de alguma forma. Mas ele bloqueia o thread de chamada até que a operação de salvamento seja concluída. FALHOU.
RestfulCoreData mantém suas -save:
chamadas intactas e não introduz nenhum tempo de espera adicional para o encadeamento do cliente. Ele simplesmente observa NSManagedObjectContextDidSaveNotification
e emite as solicitações correspondentes ao servidor no manipulador de notificação. Mas desta forma a -save:
chamada sempre é concluída com êxito (bem, dada Core Data é aprovado com as alterações salvas) e o código do cliente que realmente chamado não tem nenhuma maneira de saber o salvamento pode ter falhado para propagar para o servidor por causa de algum 404
ou 421
ou qualquer outra coisa Ocorreu um erro do lado do servidor. E mais ainda, o armazenamento local passa a ter os dados atualizados, mas o servidor nunca fica sabendo das mudanças. FALHOU.
Portanto, estou procurando uma solução possível / práticas comuns para lidar com todos esses problemas:
- Eu não quero que o thread de chamada seja bloqueado em cada
-save:
chamada enquanto as solicitações de rede acontecem. - Quero, de alguma forma, receber notificações na IU de que alguma operação de sincronização deu errado.
- Quero que o salvamento do Core Data real também falhe se as solicitações do servidor falharem.
Alguma ideia?