본문 바로가기

야곰커리어캠프_TIL

20220303 / D15 / 노티피케이션센터 예제코드 만들기 및 viewDidLoad에서 super메서드를 호출해야하는 이유

오늘학습내용

  • LifeCycle 이해하기 및 학습활동
  • viewDidLoad및 그외의 로드메서드들에서 super 메서드를 생성해줘야하는 이유
  • NotificationCenter 이해하기

학습활동에서 배운내용

  • 옵저버를 중단안하고 view를 pop하면 메모리해제가되지않을 수 있어서반드시 해제 해줘야한다. 그런데 최신앱 환경에는 그런점이 개선되겠지만 구버전에는
    그런부분을 신경을 써줘야한다.
  • viewDidLoad는 화면과 동떨어질 수 있다라는 말은 데이터는 viewDidLoad에 로드 해두었다가 필요할때 사용할 수도 있는거라서 그런의미에서 얘기한거였다.
  • navigation으로 넘어가서 dimiss를 하면 전화면으로 이동이 안되고 modaility로 넘어가서 pop을 하면 창이 내려지지않는다 이유는
    같은 속성을 가지고있는 기능을 사용해야한다.

viewDidLoad및 그외의 로드메서드들에서 super 메서드를 생성해줘야하는 이유

  • 첫번째 이유): Apple문서에 써져있음, If you override this method, you must call super at some point in your implementation.
  • 두번째 의견): 오늘 슈퍼클래스가 아무것도 하지않더라도 Apple은 언젠가 구현을 변경할 수 있으며 그렇게 되면 코드가 이상하게 작동을 멈출 수 있다.
  • 세번째 의견): Apple이 1년동안 호환성을 처리하는 방법을 지켜본결과 이제 올바른 패턴을 배우고 사용하는 것이 좋다는것이다. 우리의 앱 바이너리가 갑자기 작동을 멈출지는 모르겠지만 아이폰이 나의 바이너리가 빌드된 SDK를 감지하고 이를 기반으로 일부 OS동작을 수정한다는 것은 분명하다.
    Apple은 언젠가 미래의 일부 SDK에서 특정패턴을 따라야할 수도있다. 이것은 최선 Xcode+SDK로 다시빌드할 때까지 영향을 미치지는 않지만 소스코드 변경없이 이러한 중단을 막을 수 있다. 안전을 위해 패턴을 배우고 따르는 것이좋다.
    [여기서잠깐]
    #AppBinary란?
    컴퓨터가 실행할 기계어 코드를 포함하는 파일이다.
    #SDK란?
    소프트웨어 개발키트 또는 devikit의 약자이며 개발자가 특정 플랫폼용 응용프로그램을 만드는데 사용하는 소프트웨어 도구 및 프로그램 집합이다.
    SDK도구에는 개발자가 사용하고 자체앱에 통합할 수 있는 라이브러리, 문서, 코드샘플, 프로세스 및 가이드를 비롯한 다양한 항목이 포함된다. 그래서 SDK는 특정 플랫폼이나 프로그래밍 언어에 사용하도록 설계되었다.
    따라서 앱을 빌드하려면 iOS SDK, VMware플랫폼과 통합하기 위한 VMware SDK또는 Bluetooth 또는 무선 제품을 빌드하기위한 Nordic SDK등이 필요하다.
  • 네번째 의견): 상속 주로를 변경하고 갑자기 클래스를 변경하는 경우에 들어가는 것이 좋은습관이다. 왜냐하먄 UIVC에서 상속받던 것이 이제 viewDidLoad메서드에서 뭔가를 하는거에서 상속된다.
  • 야곰닷넷 의견):
    뷰가로드되고 났을때, 우리는 알수없는 UIViewController에서 뷰를 만들때 하는 여러 설정들을 ‘마무리’해주는 작업이 필요하다고 해요.
    그래서 super.viewdidload()를 해줘서 어떤 기초적인 설정들을 ‘마무리’해주는 작업을 하고 그 이후에 우리는 우리가 하고싶은 어떤 작업들을 하죠.
    만약에 super.viewdidload()를 맨 밑에 적고, 그 사이에 어떤 작업들을 해주게되면 아직 뷰디드로드의 설정이 끝나지않은 상태에서 어떤 작업들이 이루어지므로
    이상한 버그와 동작이 발생할 수 있는 것으로 알고있어요. 물론 그것을 제외하더라도 대충 찾아보면 습관적으로 꼭 호출하도록 하라고는 하더군요
  • 결론) 전반적으로 시스템에대해 앞으로 Apple의 행보가 어떻게될지모르니 안정적으로 기본적으로 권장하는 사항은 이행을 하자. (super를 잘쓰자 ㅎ)

Notification 이해하기

extension Notification.Name {
    //식별자
    static let jtbcKey = Notification.Name("jtbc")
}

enum BroadcaseList: String {
    case knowingBro = "아는형님"
    case runningMan = "런닝맨"
    case singAgain = "싱어게인"
}

class JTBC {
    static let key = "jtbcKey"
    // (방송하겠다고) 이벤트를 보낸다.
    func post(broadcast: BroadcaseList) {
        print("\(broadcast.rawValue) 방송을 시작합니다.")
        NotificationCenter.default.post(name: .jtbcKey,
                                        object: nil,
                                        userInfo: [JTBC.key: broadcast.rawValue])
    }
}

class Person {
    let name: String
    
    init(name: String) {
        self.name = name
        // (방송받겠다고) 수신기를 장착한다.
        NotificationCenter.default.addObserver(self, selector: #selector(excute), name: .jtbcKey, object: nil)
    }
    // (방송을 수신받으면) 메서드가 실행된다.
    @objc func excute(notification: Notification) {
        guard let receivedObject = notification.userInfo?[JTBC.key] as? String else { return }
        print("\(self.name)야! 드디어 \(receivedObject) 방송 시작한다! 본방 사수하러 가즈아~!")
    }
    
    deinit {
        NotificationCenter.default.removeObserver(self)
        print("옵저버가 해제되었습니다.")
    }
}

let jtbc = JTBC()
let quokka = Person(name: "쿼카")
let doonie = Person(name: "도니")
let roy = Person(name: "로이")
jtbc.post(broadcast: .runningMan)
//런닝맨 방송을 시작합니다.
//쿼카야! 드디어 런닝맨 방송 시작한다! 본방 사수하러 가즈아~!
//도니야! 드디어 런닝맨 방송 시작한다! 본방 사수하러 가즈아~!
//로이야! 드디어 런닝맨 방송 시작한다! 본방 사수하러 가즈아~!
 
  • NotificationCenter.default.addObserver는 타입내에있어야 self가 지정이 가능하다. 또는 타입을 직접명시해줄 수 도 있을것같다.
  • post는 보내다. 라는 의미이다. 영단어 헷갈리지말자…
  • 알림을 보낼때와 알림을 받을때는 상호간만 알고있는 고유한 키를 통해서 정보를 확인한다. 이는 Notification.Name을 통해 생성할 수 있다.
  • 기본적으로 서로를 식별하기 위한 기준의 키가 있고 / 수신자 설정 / 알림을 보내는 역할이 있다.
  • deinint을 통해서 removeObserver를 반드시 해주는것이 좋다.