TIL(Today I Learned)

7월 9일(금)

학습내용

  • NSFetchedResultController
    • CoreData의 데이터에 변동사항이 있으면 NSFetchedResultController의 delegate 메서드가 실행된다.
    • 만약 delegate 메서드가 실행되는 도중에 CoreData를 save하면 문제가 생길 수 있다.
    • 오늘 발생한 문제에 대해서 설명해보자면, 두 개의 뷰 컨트롤러 A, B에 각각의 NSFetchedResultController가 존재하고, delegate가 설정되어있었다.
    • A, B가 모두 메모리에 로드되어있고 B의 NSFetchedResultController가 담당하고 있는 데이터를 A에서 변화시키면, B의 delegate 메서드가 호출될 것이다. A에서 데이터를 변회시키고 save를 시키면, B에서 delegate 메서드가 실행되다가 도중에 save가 되버려서 B에서 보여주는 내용이 잘못되는 문제가 발생하였다.
  • UITableView
    • beginUpdates와 endUpdates 사이에서 한 개의 indexPath에 대하여 deletRows와 reloadRows를 동시에 진행하면 런타임 에러가 발생한다.
    • 오늘 발생한 문제를 설명해보자면, 5개의 셀이 있고 이 중 3번째 셀을 삭제한다고 가정해보자. 3번째 셀이 삭제되면 4번째가 3번째로 가고 5번째가 4번째로 이동하게 된다. 내가 구현한 엡은 셀마다 넘버링이 되어있어서 삭제된 셀 이후 셀의 넘버링을 갱신해줘야했다. 그래서 셀이 삭제된 indexPath에 다음 셀이 위치하게 되므로 해당 indexPath의 셀도 갱신 해줬는데 문제가 발생하였다.
    • 그래서 deleteRows를와 reloadRows를 각각 다른 beginUpdates와 endUpdates 사이에 실행되도록 하여 해결하였다. 삭제먼저하고 업데이트를 끝낸다음 다시 업데이트를 시작하여 밀리는 셀들을 업데이트 해주었다.

문제점/고민한점

  • 어떤 뷰컨트롤러의 view가 실행되었는지 아닌지를 판별하는 방법은?

해결방법

  • 뷰컨트롤러의 isViewLoaded 값으로 판단할 수 있다.

참고