2013-06-04 5 views
1

예산 앱을 구축하고 핵심 데이터에 몇 가지 문제가 있습니다. 나는 주요 카테고리와 하위 카테고리가있는 테이블 구조를 가지고있다. 각각 하나의 이름이 있으며 조합 당 하나의 이름 만 유효합니다. (즉, 몇 가지 주요 카테고리에서 하위 카테고리 보험을 가질 수 있지만 한 가지 주요 카테고리에서는 두 번 보험이 적용되지 않습니다). 그래서 주요 카테고리 및 하위 카테고리를 문제없이 추가, 제거 및 이름을 바꿀 수 있습니다. 그러나 메인 카테고리의 이름을 변경하고 하위 카테고리를 보려면이 카테고리를 다시 열면 (이것은 내비게이션 컨트롤러에 있습니다. 메인 카테고리를 선택하고 다음보기에서 하위 카테고리를 볼 수 있습니다.) 잠시 동안 아무 것도 보이지 않습니다. 잠시 후 하위 범주를 다시 열어 "다시로드"하면 다시 볼 수 있습니다.iOS : 핵심 데이터 지연 ...?

나는 FetchedResultsController를 사용하고 있습니다. 내가 뭔가를 놓치고있는 어떤 생각? 어딘가에 다시로드해야합니까? 하지만 FetchedResultsController를 사용하는 동안 테이블을 다시로드 할 필요가 없다고 생각했습니다.

는 관련 코드 섹션은 다음과 같습니다

#pragma mark Initializer and view setup 
- (void)setupFetchedResultsController 
{ 
    NSError *error = nil; 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"SpendingCategory"]; 
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"position" ascending:YES]]; 
    [self.mainCategory.managedObjectContext executeFetchRequest:request error:&error]; 
    request.predicate = [NSPredicate predicateWithFormat:@"belongsToMainCategory.name = %@", self.mainCategory.name]; 

    self.fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:request 
                     managedObjectContext:self.mainCategory.managedObjectContext 
                     sectionNameKeyPath:nil 
                        cacheName:nil]; 
} 

- (void)viewDidLoad 
{ 
    //Edit/Done button 
    UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Edit", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(editTable:)]; 
    [self.navigationItem setRightBarButtonItem:editButton]; 
    [super viewDidLoad]; 

    self.sumTitleLabel.text = [NSString stringWithFormat:@"%@%@", NSLocalizedString(@"Budget/Month", nil), @":"]; 
    self.categorySumTitleLabel.text = [NSString stringWithFormat:@"%@%@", self.mainCategory.name, @":"]; 

    [self refreshIcon]; 
    self.iconButton.hidden = YES; 
    self.iconImage.hidden = NO; 

    self.mainCategoryNameTextField.text = self.mainCategory.name; 
    self.mainCategoryNameTextField.delegate = self; 
} 

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    self.sumLabel.text = [[DatabaseFetches budgetPerMonthForManagedObjectContext:self.mainCategory.managedObjectContext] getLocalizedCurrencyString]; 
    self.categorySumLabel.text = [[self.mainCategory getMonthlyCostsOfAllSpendingCategories] getLocalizedCurrencyString]; 
    [self refreshIcon]; 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
} 
+0

'setupFetchedResultsController'에 대한 코드를 게시했지만 어디에서 호출되었는지는 표시되지 않았습니다. – morningstar

+0

- (무효) setMainCategory : (메인 카테고리 *) mainCategory { // TODO _mainCategory = mainCategory; self.title = mainCategory.name; [self setupFetchedResultsController]; } – MichiZH

답변

0

당신의 UI가 업데이트되지 않은 경우 데이터가 여전히 캐시하기 때문에, 그것은있을 수 있습니다. 아마도 세부보기 컨트롤러의 할당이 올바르게 해제되지 않았을 수 있습니다.

이 간단하게 표시하기 전에 테이블 뷰를 다시로드에 전혀 해를 끼치 지 않습니다 :

-(void)viewWillAppear:(BOOL)animated: 
    [super viewWillAppear:animated]; 
    [self.tableView reloadData]; 
} 

그러나, 테이블 뷰가 새로운 브랜드를해야한다, 그래서 이것은 자동으로 수행 할 예정이다. 뷰 계층 논리를 확인하십시오.

관련 문제