안녕하세요, 저는 여기서 우리 앱의 모델 레이어를 작업하고 있습니다.
일부 요구 사항은 다음과 같습니다.
- iPhone OS 3.0 이상에서 작동합니다.
- 데이터 소스는 RESTful Rails 애플리케이션입니다.
- Core Data를 사용하여 데이터를 로컬로 캐시해야합니다.
- 클라이언트 코드 (우리의 UI 컨트롤러)는 가능한 한 네트워크에 대한 지식이 거의 없어야하며 Core Data API로 모델을 쿼리 / 업데이트해야합니다.
서버 기반 사용자 경험 구축에 대한 WWDC10 세션 117 을 확인하고 Objective Resource , Core Resource 및 RestfulCoreData 프레임 워크를 확인하는 데 시간을 보냈습니다 .
Objective Resource 프레임 워크는 자체적으로 Core Data와 통신하지 않으며 REST 클라이언트 구현 일뿐입니다. Core Resource 및 RestfulCoreData는 모두 코드에서 Core Data와 통신한다고 가정하고 모델 계층의 백그라운드에서 모든 너트와 볼트를 해결합니다.
지금까지는 모두 괜찮아 보였고 처음에는 Core Resource 또는 RestfulCoreData가 위의 모든 요구 사항을 다룰 것이지만 ... 둘 중 어느 것도 제대로 해결되지 않는 것 같은 몇 가지가 있습니다.
- 서버에 로컬 업데이트를 저장하는 동안 메인 스레드를 차단해서는 안됩니다.
- 저장 작업이 실패하면 오류가 UI에 전파되고 변경 사항이 로컬 Core Data 저장소에 저장되지 않아야합니다.
Core Resource는 - (BOOL)save:(NSError **)error
Managed Object Context 를 호출 할 때 서버에 모든 요청을 발행 하므로 어떻게 든 서버에 대한 기본 요청의 올바른 NSError 인스턴스를 제공 할 수 있습니다. 그러나 저장 작업이 완료 될 때까지 호출 스레드를 차단합니다. 불합격.
RestfulCoreData는 -save:
호출을 그대로 유지하고 클라이언트 스레드에 대한 추가 대기 시간을 도입하지 않습니다. 단지를 감시 NSManagedObjectContextDidSaveNotification
한 다음 알림 처리기에서 서버에 해당 요청을 보냅니다. 그러나이 방법으로 -save:
호출이 항상 성공적으로 완료 실제로이 실패 할 수 저장이 때문에 일부 서버에 전파 알 수있는 방법이 없다라는 것을 및 클라이언트 코드 (물론, 주어진 코어 데이터가 저장된 변경 괜찮습니다) 404
나 421
또는 무엇이든을 서버 측 오류가 발생했습니다. 더욱이 로컬 스토리지는 데이터를 업데이트하지만 서버는 변경 사항에 대해 알지 못합니다. 불합격.
따라서 이러한 모든 문제를 처리 할 수있는 가능한 솔루션 / 일반적인 관행을 찾고 있습니다.
-save:
네트워크 요청이 발생하는 동안 호출 스레드가 각 호출 을 차단하는 것을 원하지 않습니다 .- 어떻게 든 UI에서 일부 동기화 작업이 잘못되었다는 알림을 받고 싶습니다.
- 서버 요청이 실패하면 실제 Core Data 저장도 실패하고 싶습니다.
어떤 아이디어?