담기 버튼 누르면 담은 항목을 보고 싶음
reloadData 로 하면 된다는걸 알긴하는데,, 우여곡절 리로드데이터하기 시작,,
1트
처음에는 라이브러리뷰컨 데이터 셋팅하는 메서드에다가 리로드를 했는데 안들어옴

근데 이건 또 가끔은 된다 왜...?
2트
셀에다가 리로드를 하면,,,,?

조져따
빠르게 앱종료
3트
그럼 담기버튼 누를때 리로드 하면?

안돼요
4트

야호 돼요 돼!!!!!!!!11
이유는 뷰 생명주기를 모르는 내탓,,
원래는 setBookList 메서드에 리로드를 하고 이 메서드는 viewDidLoad 에서만 호출 되었었다
근데 viewDidLoad 는 딱 한번만 호출됨!
그러니까 앱을 껐다 켜면 리스트에 들어오지만 앱을 계속 실행하고 있는 상태에서는 콜렉션뷰가 리로드 되지 않았다
그래서 viewWillAppear 에서도 메서드를 호출해주니 추가한 책이 잘 보임,,
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print(#function)
setBookList()
}
// MARK: CoreData에서 상품 정보를 불러와, bookList 변수에 저장
private func setBookList() {
guard let context = self.persistentContainer?.viewContext else { return }
let request = Book.fetchRequest()
if let bookList = try? context.fetch(request) {
self.bookList = bookList
}
libraryCollectionView.reloadData()
}
이 참에 공부하자,,
View Controller의 생명주기(Life-Cycle)

1. loadView()
: 화면에 띄워줄 view를 만드는 메소드로 view를 만들고 메모리에 올림
그리고 설명을 보면 사용자는 이 메소드를 직접 호출 하지 말라고 쓰여있다.
그리고 모두 직접적으로 코딩하여 만드는 경우를 제외하고서는 override하지 않는것이 좋다고 한다.
자세한 설명은 아래 출처에서 확인할 수 있다.
2. viewDidLoad
: 뷰의 컨트롤러가 메모리에 로드 된 후에 호출되며 시스템에 의해 자동으로 호출이 된다.
사용자에게 화면이 보여지기 전에 데이터를 뿌려주는 행위에 대한 코드를 작성할 수 있다.
일반적으로 리소스를 초기화하거나, 초기화면을 구성하는 용도로 주로 쓰인다.
이 메소드는 View Controller 생에 딱 한번 호출이 된다.
따라서 한 번만 있을 행위에 대해서는 이 메소드 안에 정의 해주어야 한다.
3. viewWillAppear
: 뷰 컨트롤러의 화면이 올라오고 난후 뷰가 화면에 나타나기 직전에 호출이 된다.
즉 뷰가 로드 된 이후, 눈에 보이기 전에 컨트롤러에게 알리는 역할.
다른 뷰로 이동했다가 되돌아올때 재 호출되는 매소드로 화면이 나타날 때 마다 수행해야하는 작업을 정의하기 좋다.
** 처음 어플리케이션이 수행되고 첫 화면이 띄워질때 호출되는 것은 viewDidLoad()와 동일하지만,
화면 전환을 통해 다시 현재의 화면으로 돌아올 때 viewDidLoad가 아닌 viewWillAppear가 호출된다.
내 경우는 여기에 해당이 되었다!! 그래서 콜렉션뷰를 리로드하는 코드를 setBookList메서드에 넣어서 viewWillAppear 에 호출해주었다
가끔 데이터가 들어온적도 있는데 아마 앱을 처음 실행하자마자 담기를 한 후에 들어온걸 확인해서 그런것 같다
viewDidLoad 를 하면서 저장된 데이터가 그려진 것,,,!

4. viewDidAppear
: view가 데이터와 함께 완전히 화면에 나타난 후 호출되는 메소드
5. viewWillDisappear
: 다음 View Controller 화면이 전환하기 전이나 View Controller 가 사라지기 직전에 호출되는 메소드
6.viewDidDisappear
: View Controller들이 화면에서 사라지고 나서 호출되는 메소드
화면이 사라지고 나서 필요없어지는 (멈춰야하는) 작업들을 여기서 할 수 있다.
어려운 내용은 아닌데 눈으로 확인해야겠습니다
이전에 만들어놓은 프로젝트를 재활용 할게요
첫번째화면과 두번째 화면 둘다 생명주기 메서드들을 호출했어요
override func viewDidLoad() {
super.viewDidLoad()
print(" 첫번째 화면 \(#function)")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print(" 첫번째 화면 \(#function)")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print(" 첫번째 화면 \(#function)")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print(" 첫번째 화면 \(#function)")
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print(" 첫번째 화면 \(#function)")
}
앱을 실행하니 콘솔창에 아래 세줄이 찍혔습니다
첫번째 화면 viewDidLoad() // 맨 처음 한번만 실행됨
첫번째 화면 viewWillAppear(_:)
첫번째 화면 viewDidAppear(_:)
다음 화면으로 넘어가봅니다
두번째 화면 viewDidLoad() // 맨처음 한번만 실행 됨
첫번째 화면 viewWillDisappear(_:)
두번째 화면 viewWillAppear(_:)
두번째 화면이 didLoad 가 되고 첫번째 화면이 사라질 예정이라고 합니다
첫번째 화면 viewDidDisappear(_:)
두번째 화면 viewDidAppear(_:)
첫번째 화면이 완전히 사라지고(didDisappear) 두번째화면이 WillAppear 할 줄 알았는데 아니군요?
두번째 화면으로 완전히 넘어와야지 첫번째 화면이 사라지니까 그런 것 같습니다
다시 첫번째 화면으로 돌아가볼게요
두번째 화면 viewWillDisappear(_:)
첫번째 화면 viewWillAppear(_:)
첫번째 화면으로 돌아가는 중에 위에 두개 로그가 찍힙니다
viewDidLoad 는 더이상 안찍히네요
두번째 화면에 다시 가볼게요
두번째 화면 viewDidLoad(_:)
첫번째 화면 viewWillDisappear(_:)
두번째 화면 viewWillAppear(_:)
화면이 넘어가는 와중에 찍힌 로그예요
첫번째 화면 viewDidDisappear (_:)
두번째 화면 viewDidAppear(_:)
두번째 화면이 꽉차니 찍힌 로그 입니다
배워야 할게 산더미,,,ㅠ

'iOS Swift > Study' 카테고리의 다른 글
[Swift] 책 검색 App (7) - 페이지를 모달로 띄울 때 주의사항 (0) | 2024.05.08 |
---|---|
[Swift] 책검색 App (6) - 담은 책 삭제 (CollectionView Cell 삭제) (0) | 2024.05.07 |
[Swift] 책검색 App (4) - 상세페이지로 이동, CoreData 로 책 담기 (2) | 2024.05.07 |
[Swift] 책검색 App (2) - Tab Bar (0) | 2024.05.05 |
[Swift] 책검색 App (1) - 네트워크 통신 (2) | 2024.05.05 |
댓글