2012-02-01 2 views
15

iCloud shoebox 응용 프로그램에 문제가있어서 그 중 일부가 나를 도울 수 있기를 바랍니다. (나는 많은 시간을 헛되이 싸워 왔습니다.)iCloud + CoreData - 미리 채워진 데이터 중복을 피하는 방법은 무엇입니까?

응용 프로그램 : - 항목 (Item1 ... ItemM)을 각각 포함하는 범주 집합 (Cat1 .. CatN)을 포함하는 간단한 라이브러리 스타일 응용 프로그램입니다. Apple의 iPhoneCoreDataRecipes를 사용하여 iCloud CoreData 스택을 설정했습니다.

iCloud를 제외한 모든 기능은 iCloud와 거의 완벽하게 작동합니다. 사용자가 처음 앱을 열었을 때 미리 사용할 수있는 미리 채워진 빈 카테고리가 많이 있어야합니다 (그 시간에는 오프라인 일 수도 있음). 여기 악마가 있습니다.

여기에 내가 할거야 - 내 persistentStoreCoordinator가 설정이되면 내가 통지 내 MasterViewController에 의해 수신

dispatch_async(dispatch_get_main_queue(), ^{ 
    [[NSNotificationCenter defaultCenter] 
     postNotificationName: @"RefetchAllDatabaseData" 
         object: self 
        userInfo: nil]; 
    }); 

을 보낼 수 있습니다. 알림이 수신되면 MasterViewController는 저장소의 범주 수를 확인합니다. 사용 가능한 범주 의 수가 0과 같으면 미리 채워진 범주가 삽입됩니다.이 1 장치에서 잘 작동 : -

는 참고로 내 ManagedObjectContext

문제가 에게 NSMergeByPropertyObjectTrumpMergePolicy를 사용합니다. 그러나 두 번째 장치의 경우 iCloud의 기본 범주는 이며, 종종이 persistentStoreCoordinator보다 나중에 수신되도록 설정되고 두 번째 장치에서 기본 범주가 삽입됩니다. 결국 두 장치에서 같은 이름을 가진 두 세트의 범주가 있습니다.

어떻게 해결할 수 있습니까?

시도한 솔루션 :이 문제를 해결하기위한 두 가지 전략을 시도했습니다. 둘 다 같은 방식으로 시작됩니다. 내가

[moc mergeChangesFromContextDidSaveNotification: note]; 

를 호출 한 후 나는 그의 참조 코드에 대한 https://devforums.apple.com/thread/126670?start=400&tstart=0에서 호세 네스 칸투 Arrambide에

[self materializeKeysWithUserInfo: note.userInfo forContext: moc]; 

많은 감사를 호출 - 본질적으로

materializeKeysWithUserInfo:forContext: 

이 note.userInfo 및 취득에서 managedObjectIds를 얻을

그 오브젝트를 사전에 두는 ManagedObjectContext의 대응하는 오브젝트

전략 1 :

  • 내 모든 카테고리 생성 시간 스탬프가 있습니다.어떤
  • 나이가 중복 범주를 선택하면 iCloud에의 삽입에
  • ,
  • 이 새로운 중복 범주에
  • 삭제 이전의 중복 카테고리

이러한 전략을 효과적으로 자신의 항목을 이동

  • 같은 이름을 가진 카테고리의 쌍을 얻을 UI에 표시되기 전에 두 장치의 중복을 모두 제거합니다. BUT

    1) 1 de 부사장은 두 번째 장치에서 길을 잃고 있습니다. 두 번째 장치에 와서 부모 범주가 없으며 범주 필드가 같지 않으므로 위치를 모르겠습니다.

    2) 잠시 동안 두 번째 장치에서 손실 된 항목도 충돌로 인해 첫 번째 장치에서 손실됩니다.

    3) 두 번째 장치에서 생성 된 일부 항목은 충돌로 인해 손실됩니다.

    나는 새에 대한 이전의 범주를 선호하려하지만

    전략에게 어떤 영향 2 포기하지 않았다 내 모든 카테고리

    • 작성 시간 스탬프가 있습니다. 어떤
    • 나이가 중복 범주를 선택하면
    • 모든 카테고리가 되지 않는 부울 필드가 아이 클라우드에서 삽입에 생성
    • NO로 설정 한
    • 는 새로운 자신의 항목을 이동 같은 이름을 가진 카테고리의 쌍을 얻을 중복 범주는
    • 마르크 나이가되지 않는 와 범주 = YES

    거의 항상 그들이 UI 에 표시하지만도 전에 두 장치에 중복을 제거 이러한 전략 두 장치에서 항목의 대부분 (또는 모두) 범주에 충돌 한 무리로 인해 손실지고

    및 항목.

    어떤 결론을 생각 : 우리는 동시에 아이 클라우드 반면 두 장치가 같은 패턴에 적합하지 않은 내용 산부인과 변경 시작 이러한 전략이 작동하지 않는 것 같습니다

    .

    제 테스트에서 나는 두 장치를 동시에 작동 시켰습니다. 제 2의 iDevice를 구입 한 행복한 사용자가 제 2의 기기 (제 1의 기기가 앱을 실행하는)에 제 앱을 설치하고 분당 모든 항목을 잃어버린 경우를 무시할 수는 없습니다.

    어떻게 이런 상황을 해결할 수 있을까요? iCloud + CoreData가 제작 준비가되었다고 생각하십니까?

    전략 3

    나는 적절한 경로에 미리 채워진 데이터베이스 (번들에서 복사)을 넣어 시도했습니다. 그것은 부분적으로 해결되었습니다 - 나는 더 이상 미리 채워진 카테고리 중복이 없습니다 BUT 사전 채워진 카테고리에 추가 된 항목은 장치에서 동기화되지 않습니다.

    iCloud는 iCloud 설정 전에 데이터베이스에있는 데이터를 인식하지 않습니다. 두 번째 장치는 카테고리가 nil 인 사전 채우기 범주의 첫 번째 장치에 삽입 된 항목을받습니다.

    iCloud 설정 후에 저장소에 추가 카테고리 (항목 및 카테고리 자체) 항목이 올바르게 동기화됩니다.

  • 답변

    관련 문제