2009-07-17 1 views
8

외부 데이터 소스를 사용하는 iPhone 용 Core Data 응용 프로그램을 작성하려고합니다. 저는 실제로 객체를 유지하기 위해 핵심 데이터를 사용하는 것이 아니라 객체 라이프 사이클 관리를 위해 핵심 데이터를 사용하고 있습니다. 로컬 데이터에 Core Data를 사용하는 방법에 대해 꽤 좋은 아이디어가 있지만 원격 데이터로 몇 가지 문제가 있습니다. 필자는 Flickr의 API를 예제로 사용하겠다.코어 데이터로 원격 데이터에 액세스하기위한 패턴은 무엇입니까?

내가 가장 먼저 말하고자하는 것은 최근 사진 목록을 외부 데이터 소스에서 가져와야한다는 것입니다. 목록을 검색 한 후에는 각 사진에 대해 관리되는 객체를 반복하고 만들어야하는 것처럼 보입니다. 이 시점에서 필자는 코드에서 계속 작업하고 표준 Core Data API를 사용하여 가져 오기 요청을 설정하고 개, 즉 개에 대한 사진의 하위 집합을 검색 할 수 있습니다.

하지만 사용자의 사진 목록을 계속 검색하려면 어떻게해야합니까? 이 두 데이터 세트가 교차 할 가능성이 있기 때문에 기존 데이터에서 가져 오기 요청을 수행하고 이미있는 데이터를 업데이트 한 다음 새 개체를 삽입해야합니까?

- 기존의 패턴에서

, 단순히 이러한 데이터 세트의 각각에 대해 별도의 데이터 구조를 가지고 적절하게 액세스 할 것입니다. recentPhotos 세트와 usersPhotos 세트. 그러나 핵심 데이터의 일반적인 패턴은 하나의 관리되는 개체 컨텍스트를 사용하는 것으로 보이기 때문에 데이터를 주 데이터 풀과 병합해야하는 것으로 보입니다 (내가 틀릴 수도 있음). 그러나 그것은 단지 사진 목록을 잡는 데 많은 오버 헤드가있는 것처럼 보입니다. 다른 집합에 대해 별도의 관리되는 개체 컨텍스트를 만들어야합니까? 핵심 데이터가 여기서도 사용해야합니까?

핵심 데이터에 대해 매력적이라고 ​​생각하는 것은 (웹 서비스의 경우) 전에 특정 데이터에 대한 요청을하고 요청에서 필터링하거나 코드에서 필터링하고 내가 사용할 목록을 생성한다는 것입니다 . Core Data를 사용하면 개체 목록을 가져 와서 내 풀에 추가하고 (필요한 경우 이전 개체를 업데이트 할 수 있음) 개체에 대해 쿼리 할 수 ​​있습니다. 그러나이 방법으로 볼 수있는 한 가지 문제는 개체가 외부에서 삭제 된 경우 오래된 데이터를 보관하고 있기 때문에 알 수 없다는 것입니다.

여기에 기지가 있습니까? 사람들이 원격 데이터 및 핵심 데이터를 처리하기 위해 따르는 패턴이 있습니까? :) 나는 그들이 그것을 한 것을 말하는 사람들의 몇몇 포스트를 찾아 냈다, 그리고 그 (것)들을 위해 작동한다, 그러나보기의 방법에서 조금. 감사.

+0

원하는 것을 더 구체적으로 지정할 수 있습니까? '외부 데이터 소스 사용'은 매우 모호합니다. 외부 데이터베이스 조각을 로컬로 미러링하려는 것 같습니다. 당신은 국지적 인 변화를 일으킬 필요가 있습니까? 갈등은 어떤가? 이것은 어려운 문제이며 자세한 내용은 지침을 제시하는 데 도움이됩니다. –

+0

아마 부실한 스레드, 나는 배경 스레드에서 물건을 가져 와서 영구 저장소에 쓰려고 시도하고 거기에서 주 스레드까지 알림을 받도록 유혹 될 것입니다. 만약 내가 그랬다면 – bshirley

답변

0

이와 같은 상황에서 Cocoa의 보관 기능을 사용하여 사진 개체 (및 색인)를 세션간에 디스크에 저장하고 응용 프로그램에서 집으로 Flickr을 호출 할 때마다 덮어 씁니다.

하지만 핵심 데이터를 이미 사용하고 있으며 제공하는 기능과 마찬가지로 "소스"또는 "callType"속성을 포함하도록 데이터 모델을 수정하면 안됩니까? 현재 소스 "Flickr API"를 사용하여 암시 적으로 많은 수의 객체를 만들고 있지만 다른 API 호출을 고유 소스로 쉽게 처리 한 다음 명시 적으로 저장할 수 있습니다.

삭제를 처리하는 가장 간단한 방법은 새로 고칠 때마다 데이터 저장소를 지우는 것입니다. 그렇지 않으면 모든 작업을 반복하고 새로운 결과에 포함되지 않은 파일 이름의 사진 개체 만 삭제해야합니다.

나는 이와 비슷한 것을 할 계획이므로 도움이되기를 바랍니다.

추 신 : 세션간에 포토 개체를 저장하지 않는다면 두 개의 서로 다른 컨텍스트를 사용하고 따로 쿼리 할 수 ​​있습니다. 저장되지 않는 한 중앙 저장소에 이미 항목이 없으면 사용자가 설명하는 것처럼 작동합니다.

2

당신의 첫 번째 본능은 옳은 것처럼 보입니다. fetchrequests를 사용하여 기존 상점을 업데이트해야합니다. 수입업자가 사용하는 접근 방식은 다음과 같습니다. 가져 오기에 적합한 모든 파일 목록을 가져 와서 어딘가에 저장하십시오. 나는이 목록을 빠르고 가볍게 (그냥 이름과 URL 또는 고유 한 ID) 얻는다고 가정하고 있지만 실제로 가져 오는 것은 약간의 시간과 노력이 필요하며 사용자는 프로그램을 종료하거나 무언가를하고 싶어합니다. 그렇지 않으면 모든 가져 오기가 완료됩니다.

그런 다음 별도의 백그라운드 스레드 (NSRunLoop 및 NSTimer 덕분에 "Core Data : Efficiently Importing Data"에 대한 Google의 의견을 듣는 것만 큼 어렵지 않습니다.)에서 해당 목록의 첫 번째 항목을 가져 와서 개체를 가져옵니다. 플리커 (Flickr) 또는 어디에서나 코어 데이터 데이터베이스 (Core Data Database)에서 검색하십시오 (효율적인 캐시 된 NSFetchRequest 설정에 관한 Apple의 Predicate Programming Guide를주의 깊게 읽으십시오). 원격 객체가 이미 Core Data에있는 경우 삽입하지 않을 경우 필요에 따라 정보를 업데이트하십시오. 완료되면 가져올 목록에서 항목을 제거하고 다음 항목으로 이동하십시오.

원격 저장소에서 삭제 된 개체의 문제에는 정기 동기화 또는 지연된 주문형 동기화라는 두 가지 솔루션이 있습니다. Flickr에서 사진을 가져 오는 것은 원본과 모든 메타 데이터를 가져 오는 것을 의미합니까 (소유권과 관련하여 정책이 무엇인지 모릅니다) 또는 미리보기 이미지와 일부 정보를 가져 오시겠습니까? 모든 항목을 로컬에 저장하는 경우 며칠 또는 몇 주마다 확인을 실행하여 로컬 저장소의 모든 항목이 원격으로 제공되는지 확인할 수 있습니다. 그렇지 않은 경우 사용자는 사진을 보관하거나 삭제할 수 있습니다. 미리보기 이미지 또는 미리보기 만 저장하는 경우 사용자가 전체 그림을보고 싶어 할 때마다 Flickr에 연결해야합니다. 삭제 된 경우 사용자에게 알리고 로컬에서 삭제하거나 더 이상 액세스 할 수없는 것으로 표시 할 수 있습니다.

2

두 가지를 조합 해보십시오. 이 전략은 NSFetchRequest의 결과를 두 번 가져 오는 인터페이스를 제공합니다. 한 번 동기식으로, 다시 한 번 데이터가 네트워크에서로드되었을 때입니다.

  1. 완료 될 때 가져 에 추가 블록 속성을 실행합니다 NSFetchRequest의 자신의 서브 클래스를 생성합니다. 이것은 네트워크에 대한 비동기 요청입니다 ( ). 로 전화하십시오. FLRFetchRequest

  2. 에게이 요청을 전달할 클래스를 생성하십시오. 전화 번호는 FLRPhotoManager입니다. FLRPhotoManager 페치 요청에 기초하여 상기 FLRFetchRequest과의 인스턴스를 얻어 방법 executeFetchRequest: ...

    1. 대기열 네트워크 요청을 가지며, 네트워크 요청 인 경우 다시 을 처리 할 페치 유지 요청 건네 끝마친.
    2. CoreData 캐시에 대한 반입 요청을 실행하고 즉시 결과를 반환합니다.
    3. 네트워크 요청이 끝나면 핵심 데이터 캐시를 네트워크 데이터로 업데이트하고 캐시에 대해 다시 페치 요청을 실행 한 다음 이번에는 FLRFetchRequest에서 블록을 가져 와서이 페치 요청의 결과를 블록으로 전달합니다 두 번째 단계가 완료되었습니다.

이 내가 함께 온 가장 좋은 패턴이지만, 당신처럼, 나는의 다른 의견에 관심이 있어요.

+0

도 비슷한 접근법을 생각해 냈습니다 - 지금까지 더 나은 방법을 찾았습니까? – Petar