2014-04-13 2 views
1

사례가 매우 간단합니다. 나는 ✓이 가령하는 MagManRecord로 RestKit에서 비롯된 NSManagedObject를 삭제할 수 없습니다

  • 패스를 작동하는 요청 NSManagedObject를 만들

    • 필요 postObject : Restkit에서 방법 ✓는 ✘, ✓
    • 프로세스 작동 IT와, ✓
    • 요청 및 MR_deleteEntity를 사용하여 응답 개체 모두 삭제 작동
    • 가 완료된 블록 NSManagedObject 응답을 수신 작동 작동하지 않습니다.

    엔티티를 생성/삭제/관리하는 데 MagicalRecord 만 사용하고 싶습니다.

    문제 :

    내가 비동기 MagicalRecord 툴킷에서 방법 저장하고 난 후 응용 프로그램을 종료 나는 여전히 SQLite는 DB 파일의 실체를 볼 수 있습니다 전화. 응용 프로그램을 다시 시작한 후 객체에 대해 MR_deleteEntity를 명시 적으로 호출했지만 새 객체가 단일 인스턴스를 삭제하지 않고 db에 추가되었습니다. 컨텍스트 관리는 내가 아직 완전히 이해하지 못했던 것임을 인정합니다.

    나는 Restkit와 MagicalRecord를 연결하려면 다음 설정을 사용하고 있습니다 :

    // 1. Setup the core data stack with the automigration 
    
    [MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:[GVUserDefaults standardUserDefaults].applicationStoreName]; 
    
    // 2. Initialize managed object store 
    
    RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithPersistentStoreCoordinator:[NSPersistentStoreCoordinator MR_defaultStoreCoordinator]]; 
    
    // 3. create the persistentStoreManagedObjectContext and the mainQueueManagedObjectContext: 
    
    [managedObjectStore createManagedObjectContexts]; 
    
    // 4. set the default and the root saving context: 
    
    [NSManagedObjectContext MR_defaultStoreCoordinator:managedObjectStore.mainQueueManagedObjectContext]; 
    [NSManagedObjectContext MR_setRootSavingContext:managedObjectStore.persistentStoreManagedObjectContext]; 
    
    
    // 5. create RestKit manager: 
    
    self.rkManager = [TSNRKObjectManager managerWithBaseURL:[NSURL URLWithString:[self serverURL]]]; 
    self.rkManager.requestSerializationMIMEType = RKMIMETypeJSON; 
    self.rkManager.managedObjectStore = managedObjectStore; 
    

    질문

    나는 요청을 삭제하려고하고 응답 객체를 이런 식으로 :

    [self saveWithBlock:^(NSManagedObjectContext *localContext) { // calls [MagicalRecord saveWithBlock:block completion:completion] 
    
        // some additional processing, getting data from the response   
    
        [loginResponse MR_deleteEntity]; 
        [loginRequest MR_deleteEntity]; 
    
    } completion:^(BOOL success, NSError *error) { 
    
        // some additional processing 
    }]; 
    

    그러나 나는 항상 로그에이 메시지가 : 나는 참조 https://gist.github.com/tonyarnold/4694673이 페이지를 사용하고

    -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x110906470) NO CHANGES IN ** UNNAMED ** CONTEXT - NOT SAVING 
    

    . 요청 및 응답 엔티티 생성 컨텍스트는 동일합니까? 엔티티 생성을 위해 Restkit은 어떤 컨텍스트를 사용합니까? [MagicalRecord saveWithBlock : 블록 완료 : 완료]에서 요청 엔터티를 블록 내에 만들어야합니까? https://github.com/blakewatters/RKMagicalRecord의 예에는 자동 마이그레이션 설정 및 비동기 저장 방법이 포함되어 있지 않습니다.

    UPDATE :

    이 수용 가능한 해결책? (깨끗하고 우아한 삭제를 의미합니다) :

     [self.loginRequest MR_deleteEntity]; 
         [self.loginRequest.managedObjectContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) { 
          // log 
         }]; 
    
    
    
         [self.loginResponse MR_deleteEntity]; 
         [self.loginResponse.managedObjectContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) { 
          // log 
         }]; 
    

    나는 이것을 테스트했으며 작동합니다. 완료 블록에서 2

    UPDATE는 Restkit의 postObject에서 트리거 : ...

    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 
    
         [[self.loginRequest MR_inContext:localContext] MR_deleteEntity]; 
         [[self.loginResponse MR_inContext:localContext] MR_deleteEntity]; 
    
        } completion:^(BOOL success, NSError *error) { 
    
         if(success) { 
    
          self.loginRequest = nil; 
          self.loginResponse = nil; 
    
          // log, update ui 
    
         } else { 
    
          // log error 
         } 
    
        }]; 
    
  • 답변

    0

    당신은 여러 상황에 대한 구원의 의미를 오해 : 내가 할 수있는 정리 영구 저장소에서 엔티티 이런 식으로, 호출합니다. saveWithBlock:에 전화 할 때 관리 대상 개체를 조작하기 전에 생성 된 새 로컬 컨텍스트로 모든 관리 개체를 전송해야합니다. 그렇지 않으면 컨텍스트에 변경 내용이없고 저장되지 않습니다. 전송하려면 관리 객체 ID를 가져와 existingObjectWithID:error:을 찾아야합니다.

    이 경우 2 개체 삭제의 경우 개체가 주 컨텍스트 (해당 개체가 속한 개체)에서 직접 삭제하고 영구 저장소에 저장하는 것이 좋습니다.

    +0

    안녕하세요, 포인터 주셔서 감사합니다. 이것이 받아 들일만한 해결책입니까? (나는 깨끗하고, 우아한 삭제를 의미한다) : 업데이트를 참조하십시오. –

    +0

    괜찮습니다. 두 번의 삭제가 모두 끝난 후에 한 번만 두 번 저장하면 안됩니다 (작은 일괄 저장 및 두 개체가 같은 컨텍스트에 있음). – Wain

    +0

    내가 이해할 수없는 사실은 내가 삭제하고자하는 엔티티와 관련된 저장 컨텍스트가 rootsavingcontext (백그라운드 작업) 또는 이전에 설정 한 defaultContext (ui 업데이트) (setDefaultContext, setRootSavingContext)의 컨텍스트가 아니라는 사실입니다. –

    관련 문제