본문 바로가기
iOS Swift/Study

[Swift] 책검색 App (5) - 책을 담았을 때 목록에서 확인하기 (feat. reloeadData 와 View Controller의 생명주기)

by 야고이 2024. 5. 7.
728x90

담기 버튼 누르면 담은 항목을 보고 싶음

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(_:)

두번째 화면이 꽉차니 찍힌 로그 입니다

 

배워야 할게 산더미,,,ㅠ

728x90

댓글