인사를 갱신하지 않습니다 :) 나는이 유사처럼 발행이의 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을} " )}
질문이 있거나 다음 바로 문의) 이전 버전의 예 (일부 더 많은 코드를 필요로하는 경우)를 예상
감사합니다 :)
좋아, 플립 뷰를 사용하는 버전을 발견했는데 ... 이미 코드를 새 것으로 복사했지만 여전히 같은 문제가 발생했습니다. :/ '- (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