NotificationCenter를 활용해 실시간으로 반응하기

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 5anniversary
      참가자
      • 글작성 : 14
      • 답글작성 : 7

      iOS 환경에서는 observer 패턴으로서 사용이 되고 있는 NotificationCenter를 사용해
      아래의 코드를 통해

      NotificationCenter.default.addObserver(forName: UITextView.textDidChangeNotification, object: postingTextView, queue: OperationQueue.main) { (notification) in
          if self.postingTextView.text != ""{
              self.postBtn.isEnabled = true
          } else {
              self.postBtn.isEnabled = false
          }
      }
      

      1번째 사진, 2번째 사진
      게시글과 이미지가 작성되었을때 게시 버튼이 활성화 될수있는 기능을 추가할 수 있습니다.
      추가적으로 observer 패턴을 사용해 추가할수 있는 기능과 사용법을 알아보자면
      observer 패턴은 해당되는 프로퍼티가 변경 되고 있는걸 관찰하다 변경이 되는 시점에 업데이트가 되도록 하는 패턴입니다.
      observer 패턴으로 이용되는 notification을 사용하는 방법은

      1. addObserver 메서드를 통해 notificationCenter에 새롭게 생성
      2. post 메서드를 통해 해당하는 observer가 미리 지정해 놓은 Event를 실행
      3. removeObserver 메서드를 통해 해당하는 observer를 notification center에서 삭제
        • 하지만 3번째인 removeObserver는 iOS 9.0, macOS 10.11 이후의 버전을 타겟으로 앱을 만든다면 사용할 필요가 없음

      사용 예시

      @IBOutlet weak var nameLabel: UILabel!
      @IBOutlet weak var chaneBtn: UIButton!
      override func viewDidLoad() {
          super.viewDidLoad()
          nameLabel.text = "피너츠"
          chaneBtn.setTitle("이름 변경", for: .normal)
          chaneBtn.sizeToFit()
          chaneBtn.addTarget(self, action: #selector(change), for: .touchUpInside)
          NotificationCenter.default.addObserver(self, selector: #selector(changeName), name: Notification.Name("forChangeName"), object: nil)
      }
      @objc func change(){
          NotificationCenter.default.post(name: NSNotification.Name("forChangeName"), object: nil)
      }
      @objc func changeName(){
          nameLabel.text = "스누피"
      }
      

      변경 전
      3번째 사진
      변경 후
      4번째 사진
      tip. 위에서 notification이 사용될때 자주 사용되는
      Notification.Name을 Extension으로 새롭게 프로퍼티에 추가 할 수 있습니다.

      extension Notification.Name {
      static let forChangeName = Notification.Name("forChangeName")
      }
      

      으로 extension을 새롭게 만들어 준다면

      NotificationCenter.default.addObserver(self, selector: #selector(changeName), name: .forChangeName, object: nil)
      

      와 같이 사용할 수 있습니다
      또한 미리 정의되어 있는 프로퍼티는 아래의 링크에서 확인할 수 있습니다.
      notification.name

    • Hyungkook Jin
      참가자
      • 글작성 : 0
      • 답글작성 : 1

      구글에서 NotificationCenter addObserver 검색하다 6번째 정도 나와서 타고 들어왔는데

      본문의 1번째, 2번째…4번째 사진이 텍스트만 있고 이미지가 안 보입니다.

      추후에 업로드 하려다 놓친것 같기도 해 보여서 코멘트 남겨요.

1 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom