2013-11-01 2 views
0

사용자가 데이터를 입력하거나 편집 할 수있는 모달보기 컨트롤러가 있습니다. 저장 및 취소 버튼이 있습니다. 그래서,이 viewController 새 NSManagedObjectContext 만들고 속성에 저장하십시오. 사용자 수정 또는 데이터를 입력하는 동안MagicalRecord MR_saveToPersistentStoreWithCompletion very slow

self.controllerContext = [NSManagedObjectContext MR_context]; 

다음, 난 controllerContext에 대한 이러한 entites entites 및 값을 생성한다.

사용자는 내가 다음을 수행 취소 버튼에 도달하는 경우 :

- (void)cancelButtonClicked { 
    [self.controllerContext rollback]; 
    [self.controllerContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) { 
     if (success || error == nil) { 
      [self dismissViewControllerAnimated:YES completion:nil]; 
     } else { 
      if (error) { 
       [ErrorUtil logError:error fromAction:@"TagebuchDetailView Cancel"]; 
      } 
      [SVProgressHUD showErrorWithStatus:error.localizedDescription]; 
      [self dismissViewControllerAnimated:YES completion:nil]; 
     } 
    }]; 
} 

이 꽤 잘 작동하고 값 중 어느 것도 저장되지됩니다. 사용자가 저장 버튼을 칠 때, 나는 다음을 수행 : 2-10 entites뿐만 아니라 잘 작동하지만 저장

- (void)saveButtonClicked { 
    //Last modified setzen 
    self.selectedEintrag.lastModified = [NSDate date]; 
    self.selectedEintrag.isDirty = [NSNumber numberWithBool:YES]; 

    //Save Context and dismiss 
    self.subTitleView.navigationBarSubtitle = NSLocalizedString(@"view.subtitle.saving", nil); 
    [self.controllerContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) { 
     if (success || error == nil) { 
      [self dismissViewControllerAnimated:YES completion:nil]; 
      self.subTitleView.navigationBarTitle = nil; 
     } else { 
      if (error) { 
       [ErrorUtil logError:error fromAction:@"TagebuchDetailView Save"]; 
      } 
      [SVProgressHUD showErrorWithStatus:error.localizedDescription]; 
      [self dismissViewControllerAnimated:YES completion:nil]; 
     } 
    }]; 
} 

는 상 아이폰 4와 3-5에 5-10 초 정도 걸립니다 아이폰 5. 이것은 적은 양의 저장된 데이터에 대해서는 꽤 길다. 최근에 MagicalRecord 2.2 Release로 업데이트되었습니다.

어떤 아이디어 일 수 있으며 절약 성능을 향상시키는 방법은 무엇입니까? 아마 2.2의 버그일까요? 나는 Magicalrecord의 이전 버전을 사용하고 저축 performace는 최근에 나쁘게되었다. 나는 magicalrecord가 최근에 iOS7에서 업데이트되거나 테스트되는지 확실하지 않습니다.

+0

mainThread 컨텍스트에 저장하지 마십시오. –

+0

그러나 사용자가 데이터를 입력하면 새 엔터티가 컨텍스트에 삽입됩니다. 이러한 액션은 UI 내에서 발생하므로, 객체는 localContext에 삽입됩니다. 그리고 문제는 차단 UI가 아니라 저장 작업의 성능입니다. – Grinarn

+0

5-10 초가 걸린다면 Instruments의 지연을 찾아 내고 거기에서부터 쉽게 이동해야합니다. 게시 한 코드에는 지연이 발생할 것으로 예상되는 내용이 없습니다. –

답변

0

그래서 나는 이것을 스스로 발견했다. 문제는 controllerContext가 기본 컨텍스트의 하위 컨텍스트라는 것입니다. 다른보기에서, 나는 fetchedresultcontroller 기본 컨텍스트에서 수신 대기했다. 컨트롤러 컨텍스트를 저장할 때 서로를 차단 한 것처럼 보입니다. 제 생각에는 컨트롤러의 상위 컨텍스트를 루트 저장 컨텍스트로 설정하는 것이 었습니다.

self.controllerContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_rootSavingContext]]; 

그런 다음 모든 것이 매력처럼 작동합니다.

+0

나는 이것을 시도했지만 내 FetchedResultsController는 개체가 저장되었을 때 업데이 트되지 않았습니다. –