목록 업데이트 (테이블 뷰 업데이트)
ViewController
의 viewDidLoad
에는 보통 한 번만 실행하는 초기화 코드를 작성한다.
viewWillAppear
- 뷰가 화면에 표시되기 전 자동으로 실행되는 함수
- 여기서 테이블뷰에게 목록을 업데이트하라고 알려주면 됨
- 데이터소스가 전달해주는 최신 데이터로 업데이트 함
다만, 위의 방법은 iOS12까지 사용하던 presentation: fullScreen 옵션 하에만 적용된다. (iOS13부터 기본인 sheet에는 적용 X)
-
참고로 presentation 변경 방법은 segueway를 선택 후 인스펙터에서 설정하기
-
iOS12 플랫폼에서 same as destination을 presentation 옵션에서 설정해 준 뒤 실행하면 Appdelegate에서 window 속성을 추가해달라는 메시지와 함께, 검정 화면만 뜨고 실행되지 않는다.
-
해결방법: AppDelegate에 window 속성 추가
iOS 13 이상 해결 방법
- save 버튼을 누를 시 notification 전달
- notification이 전달되는 시점에 tableview 업데이트 구현
notification
- 추후 다른 포스트로 정리할 예정
- 간단히 생각하면 라디오와 같다고 생각하면 된다.
- 라디오는 주파수를 통해 구분하지만, notification은 이름으로 구분
- 앱을 구성하는 모든 객체로 전달(BroadCast)
- 옵저버를 추가한다. 이는 한 번만 실행되기 때문에 보통 viewDidLoad에서 행한다. 여기서는 MemoListTableViewController에서 실행
- 첫번째 파라미터: 옵저버를 추가할 Notification의 이름
- 두번째 파라미터: 특별한 이유가 없으면 보통은 nil
- 세번째 파라미터: 해당 메소드를 어디서 실행할지.
- UI 업데이트 코드는 메인 스레드에서 실행하는 것이 기본
- iOS에서는 dispatchQueue
, OperationQueue
에서 처리
- 네번째 파라미터: 클로저. 4번째 파라미터로 전달한 클로저가 3번째 파라미터로 전달한 스레드에서 실행. 여기에서는 테이블 뷰 리로드.
Notification에서 제일 중요한 Observer 해제
- 해제하지 않으면 내부에서 메모리가 낭비됨
addObserver
메소드에서는 옵저버를 해제할 때 필요한 객체를 리턴해줌.
- 토큰 저장 객체 추가
- 옵저버는 뷰가 사라지기 전 해제하거나, 소멸자에서 해제함.
결과
제대로 테이블 뷰가 리로드 되는 것을 확인