2011-08-08 2 views
5

인사를 갱신하지 않습니다 :) 나는이 유사처럼 발행이의 Working with the same NSManagedObjectContext in multiple tabs
배경 :
내 managedObjectContext (더 MOC) 내 AppDelegate에 클래스의 초기화 및
myViewController.managedObjectContext = self.managedObjectContext; 또는 여러 탭을 축복하는 전달됩니다 self.managedObjectContext = pContext; 으로 초기화 메소드에서 플로우는 다음과 같습니다. 첫 번째보기는 콜렉션의 간단한 목록입니다. 컬렉션은 NSFetchedResultsController (myViewController : UITableViewController<NSFetchedResultsControllerDelegate>)로 가져옵니다. 하나를 선택하면 더 깊이 탐색하지만 여전히이 MOC를 통과합니다.
다음 컨트롤러 (detailsViewController)에서이 컬렉션의 일부 항목 (예 : 스위치 설정)과 상호 작용할 수있는 항목을 나열합니다.
이제NSManagedObjectContext 제대로

// DetailsViewController.m 
NSManagedObjectContext* editingContext = [[NSManagedObjectContext alloc] init]; 
[editingContext setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]]; 
self.editingObjectContext = editingContext; 

내 문제 :
나는 또한 editingObjectContext을 내보기 때문에, 내가 folowing 트릭을 사용하고 회전 : 더

// DetailsViewController.m 
DetailsView *localAct = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ] 
DetailsView *localSen = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ] 

UITableView *localContainerView = [[UITableView alloc] init]; 
self.containerView = localContainerView; 
[localContainerView release]; 
//[...] 
[containerView addSubview:actuatorView]; 
self.tableView = containerView; 

나는이 항목을 관리 할 수있는 버튼이 있습니다 (그것들 중 어느 것이 표시되고 그렇지 않은지). 이 버튼은 테이블을 새로운 fetchResult로 다시로드합니다.

// DetailsViewController.m 
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
// init + create predicate 
NSSet* set = [sen filteredSetUsingPredicate:predicate]; 
if([set count] > 0) 
{ 
    for(Act* act in set) 
    { 
     [editingObjectContext deleteObject:act]; 
    } 
} 
else 
{ 
    Act* act = [NSEntityDescription insertNewObjectForEntityForName:@"Act" inManagedObjectContext:editingObjectContext]; 

    // do things 
} 
NSError *error = nil; 
[[detailView fetchedResultsController] performFetch:&error]; 

[self.containerView reloadData]; 
[detailView reloadData]; 
} 

을하지만 관리보기에서 항목을 선택 (manageItems) 저장을 클릭 후보기를 표시하지 않습니다

// DetailsView.m 
- (void) manageItems{ 
managing = !managing; 
[viewController setIsManaging:managing]; // parent 
self.fetchedResultsController = nil; 

NSError *error = nil; 
[[self fetchedResultsController] performFetch:&error]; 

[self reloadData]; 
[self updateBarButton]; 
} 

상황에 항목을 넣어하는 방법은 이렇게 본다 :/나는 탭을 전환하거나 다른 컨트롤러 (상위 또는 하위)에서 탐색하여이를 실현해야합니다. 내 ViewWillAppear 방법 :

// DetailsViewController.m 
- (void)viewWillAppear:(BOOL)animated 
{ 
[super viewWillAppear:animated]; 
DetailsView *detailView = se ? senView : actView; 
// [do uninteresting stuff] 
[detailView.fetchedResultsController performFetch:nil]; 
[self.tableView reloadData]; 
// [do uninteresting stuff] 
} 

및 viewWillDisapper은 일 단 1 개보기가하던 earliert적인 버전에서

- (void)saveChanges 
{ 
if(![editingObjectContext hasChanges]) 
    return; 

// send save-command to server 
} 

를 호출하고 난 ... 정말 많이 변경되지 않은 :/그래서 돈 MOC가 왜 그렇게 행동하는지 이해하지 못합니다. "manageItems"부분은 거의 동일합니다. 컨트롤러 대신 DetailsView에서 새 버전의 레벨이 조금 더 깊습니다. ...

누군가가 내가 무엇을 시도 할 수 있는지 말해 줄 수 있으면 서버에서 응답 지연이 새로 고침을 위해 높기 때문에 관리 및 일반 사이의 솔루션을 볼 수 없기 때문에 뷰를 뒤집을 필요가 없습니다. 또한 self.tableView/detailView/self.containerView refresh 동일한 결과를 가져온다 : /).

두 번째 문제 : 서버에 전송 한 후 "editingObjectContext save :"메서드를 호출 할 수 없습니다. 오류를 발생시키고 로컬 데이터베이스에 전혀 저장하지 않기 때문입니다. handleChangeResponse에서

오류 : ". 작업을 완료 할 수 없습니다 (코코아 오류 133020.)" 오류 도메인 = NSCocoaErrorDomain 코드 = 133020 사용자 정보 = 0x4d8bb90 {conflictList = ( "NSMergeConflict (0x5a2fac0) NSManagedObject에 대한 (0x5a46a80) objectID '0x5a46420'(oldVersion = 7 및 newVersion = 8) 및 이전 객체 스냅 샷 = {\ n iconName = noicon; \ n [...]; \ n} 및 새 캐시 된 행 = {\ n iconName = noicon; \ n [...] \ n을} " )}

질문이 있거나 다음 바로 문의) 이전 버전의 예 (일부 더 많은 코드를 필요로하는 경우)를 예상

감사합니다 :)

+0

좋아, 플립 뷰를 사용하는 버전을 발견했는데 ... 이미 코드를 새 것으로 복사했지만 여전히 같은 문제가 발생했습니다. :/ '- (void) manageItems/* DetailsViewController */ { \t DetailsView * detailView = isSen? senView : actView; \t [detailView manageItems]; }' --- '- (무효) manageItems // DetailsView { \t managing =! managing; \t [viewController setIsManaging : managing];/* parent */ \t self.fetchedResultsController = nil; \t NSError * error = nil; \t [[self fetchedResultsController] performFetch : & error]; \t [viewController.containerView reloadData]; \t [self updateBarButton]; }' – geo

답변

6

해결책이있는 것 같습니다! 합니다 (AppDelegate에 내 경우)

[managedObjectContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy]; 

최상위 MOC이 속성을 설정 http://pauloliveira.net/tech/core-data-merging-conflicts
에 발견하고없는 경우 다른 : IOS 5.0부터 새로운 NSManagedObjectContext에 대한 방법이있다!)

+0

setMergePolicy :는 iOS 3.0에서 사용할 수 있습니다. – rowwingman

0

내가 발견 나는에

[NSComparisonPredicate predicateWithLeftExpression: ...] 

를 사용하는 이전 버전에서 ... 술어의 : 구체적으로 - 그것은 ... 내가 위에 쓴 모든 것을 잊고 일을하지 않는 이유는 ... 문제는 fetchrequest에 있었다 실제 버전 나는 옵션의 수를 확장 할 수 있었고 그것이로 데이터베이스에서 추출 된 MOC 클래스의 완전한 객체 (,)를 비교 (술어에 문제를 만들었 기 때문에 또한 요청 자체를 편집하기 때문에 시온 나는

NSString * predicateFormat = [NSString stringWithFormat: ...]; 
NSPredicate* predicate = [NSPredicate predicateWithFormat:predicateFormat]; 

사용 엔티티가 작동하지 않아서 DetailsViewController에서 해결 방법을 관리했으며이 위치에서 업데이트를 롤백하지 않았습니다.
이 문제에 너무 많은 시간을 낭비하지 마십시오. <하지만 문제가 해결되면 확인하십시오. D

저장 문제가있는 두 번째 문제가 계속 있는지 확인하겠습니다. 그렇지 않다면 게시물을 업데이트 할 것입니다. 그렇지 않으면이 주제가 닫히지 않습니다 :/

0

이것은 개체를 사용하고있는 개체를 사용하여 manageobject 컨텍스트가 원인 일 수 있습니다. 로그 아웃하거나 뒤로 이동할 때 모든 NSManagebobject를 제거하십시오. 앱을 사용하여 말하십시오. 이게 ...

[NSManagebobjectcontext setManagedObjectsDictionary:[NSMutableDictionary dictionary]]; 
관련 문제