꾸준히 안타치기

NotificationCenter를 사용해 새로고침, 여러번 호출되는 문제해결 본문

iOS/문제해결

NotificationCenter를 사용해 새로고침, 여러번 호출되는 문제해결

글자줍기 2022. 6. 9. 04:16
반응형

NotificationCenter  관찰해서 알려주는 역할( 등록된 옵저버에게만 )을 한다.

 

등록된 관찰자에게 정보를 브로드캐스트할 있도록 하는 알림 디스패치 메커니즘

언제 사용하는게 적합할까?

  • 앱 내에서 연결없는 두 개 이상의 컴포넌트들이 상호작용을 해야 할 때
  • 위에 상호작용이 반복적/지속적으로 진행되어야 할 때
  • 일대다 /  다대다 통신을 사용하는 경우
  • 단점 : 수신자와 송신자의 위치를 찾기가 쉽지 않다. 컴파일시 구독이 잘되고 있는지, 올바르게 받아오는지 체크불가능

NotificationCenter - 뷰에 상관없이 이벤트 처리를 해줄수 있다.

Post

post는 전송 하는 notification으로 노티를 Observer에게 전달할 값을 전달해주는 부분이다.

Observer 등록

옵저버에서 탐지를하고 있다가 노티가 오면 실행한다.

Observer 삭제

NotificationCenter 는 싱글턴 인스턴스기에 앱전체에서 공유가 된다. 그렇기 때문에 옵저버를 등록한 오브젝트가 메모리에서 해제되면 NotificationCenter에게 옵저버를 삭제했다고 알려줘야한다.


글보기창을 띄우고 작성후 완료버튼을 눌렀을때 창이 닫히고, 바로보이는 북마크모음글을 바로 업데이트하는데 NotificationCenter를 활용해보았다.

 

할일) 디테일 VC를 닫기버튼을 눌러 닫으면, 북마크 모음VC를 업데이트 한다.

 

좋아요를 눌러서띄운 DetailVC

// 노티1.시작의 시작등록.글수정후에 메인피드를 새로고침하기위한 노티
let ModifyVCNotification: Notification.Name = Notification.Name("노티이름")

// 노티2.창이 닫힐때 노티를 메인피드로 신호를 보낸다.
NotificationCenter.default.post(name: 노티이름, object: "전달할값 ", userInfo: nil)

북마크모음VC의 viewdidload

// 노티3.DetailVC에서 보낸 값을 받기위해 DissmissWrite의 노티피케이션을 정의해 받을 준비한다.
let 노티이름 = Notification.Name("노티이름")


// 노티4.옵저버를 등록하고,DissmissWrite가 오면 writeVCNotification함수를 실행한다.
NotificationCenter.default.addObserver(self, selector: #selector(self.action(_:)), name: DissmissWriteVC, object: nil)

// 노티5.옵저버가 노티를를 받았을때 실행할 내용: 데이터 리로드
    @objc func action(_ noti: Notification) {
    
        // 북마크가져오기 API호출
         requestFeedAPI()
              OperationQueue.main.addOperation { // DispatchQueue도 가능.
               // 업데이트
                self.collectionView.reloadData()
            }
        }

북마크모음VC의 viewDidsappear

// 뷰가 사라질때 삭제
NotificationCenter.default.removeObserver(self, name: ModifyVCNotification, object: nil)

새로고침시에 유용히 활용하였다.

https://nsios.tistory.com/36

 


문제) NotificationCenter를 이용해 창을 닫았을때  특정화면으로 이동하는 코드를 작성했는데,  이동이 여러번 되는 현상이 발생하였다.

아무래도 NotificationCenter 여러번 호출이되어서 그런가 의심이 되었다. 이동한 화면에도 NotificationCenter가 있었기에

구글링을 해보니 NotificationCenter을 사용할때 주의할 점이 있었다.

이것을 사용할때는 쓰지 않는 뷰컨트롤러에서 옵저버가 계속 사용된다면 중복사용이 될수 있다. 이를 해결하는 방법은

앱생명주기를 이용해 옵저버를 등록하고, 삭제를 꼭 해주어야한다. 옵저버 삭제를 해주지 않아서 생긴 문제였음. 

// 뷰가 나타날때 실행
override func viewWillAppear(_ animated: Bool) {
    SetNotification()
}

//뷰에서사라질때 삭제
override func viewDidDisappear(_ animated: Bool) {
    DeleteNotification()
}


// 노티피케이션실행
func SetNotification(){
NotificationCenter.default.addObserver(self, selector: #selector(self.ModifyVCNotification(_:)), name: ModifyVCNotification, object: nil)

}

// 노티피케이션삭제
func DeleteNotification(){
    NotificationCenter.default.removeObserver(self, name: ModifyVCNotification, object: nil)
}

옵저버 삭제를 해주니 중복으로 나오는 현상이 사라졌다.


 

https://0urtrees.tistory.com/26

 

iOS Notification 노티 사용 시 주의할점(중복노티 방지)

안녕하세요! 민군입니다. 오늘 좋은 팁을 하나 알아서 바로 포스팅을 써보게 되었습니다. iOS개발을 하다보면 NotificationCenter를 통해 노티를 사용할 수 있습니다. 특정이벤트를 감지해서 알려주는

0urtrees.tistory.com

https://jinshine.github.io/2018/07/05/iOS/NotificationCenter/

 

[iOS] NotificationCenter - jinShine

NotificationCenter NotificationCenter의 동작에 대해 먼저 이야기 해보겠습니다. NotificationCenter에 등록된 Event가 발생하면 해당 Event들에 대한 행동을 취하는것. 앱 내에서 아무데서나 메시지를 던지면 앱

jinshine.github.io

 

 

반응형
Comments