2010-03-14 1 views
2

NSFetchedResultsController를 사용하여 1 개월 이상 앱을 제작하고 있으며 3.1.2 SDK에서 앱을 테스트하고있었습니다. poblem은 내 응용 프로그램에서 NSFetchedResultsController를 사용하고 SDK의 3.1.2 버전에서 작업하고 있었기 때문에 이제는 내 클라이언트가 3.0 버전과 호환되도록해야하고 마감일이 거의 다되었다고합니다.NSFetchedResultsController가 나를 미치게합니다.

하지만 contoller가 처리하는 객체를 변경할 때마다 충돌이 발생합니다. 응용 프로그램이 매우 이상한 오류로 인해 충돌합니다.

섹션의 마지막 개체를 제거 할 때와 변경 사항으로 인해 개체가 다른 섹션을 좋아할 때 문제가 발생합니다.

나는 Dave Mark와 Jeff LaMarche의 "iPhone 3 Development Tackling iPhone SDK 3"샘플 코드를 사용하고 있습니다. link text

다음은 응용 프로그램이 충돌 할 때의 콘솔 출력 샘플입니다.

*** 캐치되지 않은 예외 'NSInternalInconsistencyException'으로 인해 앱 종료 중, 이유 : '잘못된 업데이트 : 잘못된 섹션 수입니다. 업데이트 (1) 후 테이블 뷰에 포함 된 섹션 수는 업데이트 (2) 이전의 테이블 뷰에 포함 된 섹션 수와 같거나 삽입 또는 삭제 된 섹션 수를 더한 값 또는 빼기 값이어야합니다. 삭제됨). ' 2010-03-14 16 : 23 : 29.758 Instaproofs [5879 : 207] 스택 (807,902,715 , 7,364,425, 807,986,683, 811,271,572 , 815,059,090, 815,007,323 , 211,023, 4,363,331 , 810,589,786, 807,635,429 , 810,579,728, 3,620,573, 3,620,227 , 3,614,682, 3,609,719 , 27,337, 810,595,174, 807,686,849, 807,683,624 , 839,142,449, 839,142,646 , 01,235,814752238 )

NSFetchedResultsController가 버그가 있다는 것을 알고 있다면 나는 그것을 사용하지 않을 것입니다.

그래서 기본적으로 3.0 이상의 SDK에서 정상적으로 작동하려면 NSFetchedResultsControllerDelegate가 필요합니다.

누군가 내가 잘못하고있는 것을 알아내는 데 도움이된다면 생명의 은인이 될 것입니다.

답변

5

테이블을 삭제해야 할 때 테이블에 섹션을 삽입한다는 오류 메시지가 나타납니다. 총 4 개의 섹션을 예상하도록 tableView에 알려 주더라도, tableView 데이터 소스는 업데이트 후에 하나의 섹션 만 제공합니다.

이것은 NSFetchedResultsController가 버그가있는 것으로 생각하지 않지만 단순한 유스 케이스를 벗어나 구현하는 것은 까다로운 일입니다. 컨트롤러의 결과로 충돌이 거의 발생합니다. didChangeObject : atIndexPath : forChangeType : newIndexPath 대리자 메서드. 이 방법을 성공적으로 구현하려면 (적어도 필자의 경험에 비추어 볼 때) changeTypes는 object와 indexPath 모두 구동된다는 점을 명심해야합니다. 이로 인해 "업데이트"와 "이동"이 개념적으로 까다로워집니다.

관리 객체가 새 sectionNameKeyPath로 정렬되도록 변경되는 경우를 생각해보십시오.개념적으로, 우리는 fetchedResultsController가 tableview의 새로운 표제 아래에서 그것을 정렬하기 때문에 객체를 새로운 섹션으로 "옮긴"것으로 생각합니다. 그러나 객체의 indexPath가 변경되지 않으면 fetchedResultsController는이 값을 "이동"이 아니라 "업데이트"로 간주합니다.

변경된 관리 객체가 여전히 동일한 indexPath를 유지하더라도 fetchedResultsController의 다른 객체는 변경 사항에 의해 부딪혀 새로운 indexPath를 가질 수 있습니다. 즉, 위임 메소드의 "업데이트"섹션에서 섹션 삽입 및 섹션 삭제를 수동으로 처리해야합니다. 대리자 메서드의 "이동"섹션에서 비슷한 문제를 해결해야합니다.

LaMarche의 수정본은 너무 많은 단어로 설명하지 않고 가능한 한 많은 유스 케이스를 수용하는 일반적인 방식으로이 문제를 해결하려고 시도하고 있습니다. 사용 사례와 관련된 문제를 이해함으로써 LaMarche가 사용하는 코드의 복잡성을 크게 줄일 수 있습니다. 델리게이트 메서드의 "업데이트"및 "이동"섹션에 특히 중점을 둡니다. 이러한 메서드는 문제의 가장 큰 원인 일 수 있습니다.

+0

참고 : 알고있는 NSFetchedResultsController 3.0 버전에는 버그가 하나 있으며 클래스 참조 설명서에 언급되어 있습니다. 버그는 sectionNameKeyPath를 지정하지 않는 경우에만 문제가됩니다. 보안을 위해 문서에 제공된 해결 방법을 구현하는 것이 좋습니다. – glorifiedHacker

+1

위의 게시물은 매우 유용합니다. 나는 원래의 포스터와 같은 문제를 안고있다. (NSFetchedResultsController *) 컨트롤러 didChangeObject : (ID) anObject를 atIndexPath은 (NSIndexPath *) indexPath \t forChangeType (NSFetchedResultsChangeType) \t newIndexPath 입력 (NSIndexPath (공극) 제어기 - I는 어떤 변경 후 데이터를 재로드 것을 발견 *) newIndexPath는 시간의 100 %가 아니지만 대부분의 시간 동안 작동합니다. 나는 이것이 얼마나 중요한지 모른다. 그러나이 게시글을 가로막는 모든 사용자에게 도움이되기를 바랍니다. –