Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

<3주차> NotificationCenter 동작 방식과 활용 방안에 대해 설명하시오. #15

Closed
namsoo5 opened this issue Nov 13, 2020 · 7 comments

Comments

@namsoo5
Copy link
Collaborator

namsoo5 commented Nov 13, 2020

No description provided.

@namsoo5
Copy link
Collaborator Author

namsoo5 commented Nov 17, 2020

Notification Center 동작방식

하나의 앱에는 알림센터가 하나씩 존재
어느화면에서 이벤트가 발생했다는 것을 Notification Center로 송신
Notification Center에서 해당 발생된 이벤트를 모든 화면에 broadcast방식으로 전송
해당 이벤트를 구독하는 Observer가 있다면 해당 화면에서 이벤트에 대한 처리

활용방안

화면간 연결관계가 없는경우
화면의 Depth가 깊을 때
같은 이벤트로 다수의 옵저버가 필요한경우

참고링크

@iJoom
Copy link
Collaborator

iJoom commented Nov 19, 2020

NotificationCenter
등록된 옵저버에게 정보를 브로드 캐스트 할 수 있는 알림 발송 메커니즘
등록된 옵저버에게 동시에 노티피케이션을 전달하는 클래스
NotificationCenter 클래스는 알림을 발송하면 노티피케이션 센터에서 메세지를 전달한 옵저버의 처리할 때까지 대기합니다. 동기적(synchronous)
+) 노티피케이션을 비동기적으로 사용하려면 NotificationQueue를 사용

활용

  1. 네트워킹이 시작 및 완료되는 시점, 음악 및 동영상 재생 등에도 재생이 끝나는 시점에 관련 정보를 넘겨 줌
  2. 파일을 다운로드 받으면서, 다른 뷰로 넘어갔을때 파일 다운로드 완료시 알림 전송 가능
  3. 하나의 이벤트에 대해 서로 다른 독장을 동시에 처리할 때 ex) 이벤트 발생시, 하나의 뷰컨트롤러는 특정 아이템이 사라져야 할때, 다른 뷰컨은 특정 아이템이 생겨나야 할때
  4. 앱이 inactive 및 background 상태에서 active 상태로 넘어올때(앱의 라이프 사이클에서 가능)) 특정 이벤트나 정보 전달을 필요로 할때

@iJoom iJoom added the 인준 label Nov 19, 2020
@khyunjiee
Copy link
Member

Notification Center

미리 등록된 observer들에게 notification을 전달하는 것 NSNotificationCenter

NotificationCenter 클래스는 Observer pattern에서 observer를 등록하고, notification을 역할만 빼서 추상화 레벨을 올린 구현체이다.
subject와 observer 둘 다 NotificationCenter에 등록되어 있다면 그에 맞는 notification 발생 시 NotificationCenter에서 그에 맞는 일을 수행한다.

iOS MVC 패턴에서는 주로 model이 subject, view controller가 observer가 된다.
image

NotificationCenter 동작 방식

  • NotificationCenter.default.addObserver()
    NotificationCenter 생성
    default 설정 외에도 직접 객체를 생성할 수 있다.
    NotificationCenter로 notification이 오면 center는 등록된 observer list를 모두 스캔한다.

  • let name = Notification.Name("String")
    Notification 객체 생성
    string으로 고유의 identifier를 생성해줌

  • addObserver(forName:object:queue:using:) addObserver(_:selector:name:object:)
    Notification 등록

  • post(name:object:userInfo:) post(name:object:) post(_:)
    해당하는 observer가 미리 지정해 놓은 event 발생

활용 방안

  • 유저의 이벤트에 대해 즉각적인 반응이 필요할 때
  • 실시간으로 데이터를 처리해야할 때

@5anniversary
Copy link
Collaborator

NotificationCenter

Foundation > Notification > NotificationCenter

NotificationCenter에 등록된 Event가 발생하면 해당 Event들에 대한 행동을 취하는것.
앱 내에서 아무데서나 메시지를 던지면 앱 내의 아무데서나 이 메시지를 받을 수 있게 해 주는 것이 NSNotificationCenter의 역할~

보통은 동기적으로 작동하는 구조체, 비동기적으로 사용하려면 NotificationQueue를 사용해 이용하면 해결!

3가지 구성요소로 작동을 하는데

  • Listener (observer) : notifications를 감지
  • Sender : 필요할 때 notifications를 보내주는 역할
  • itself : notification center it self~

Observer가 관찰 시작 -> 작업이 발생하면 Sender가 Post -> Observer selector 실행

활용 방안

  • 뷰에서 다른 뷰까지 영향을 미치는 작업이 필요한 경우
  • 실시간 처리가 필요한 경우

@choidam
Copy link
Member

choidam commented Nov 20, 2020

Notification Center

NotificationCenter 에 등록된 event 가 발생하면 해당 event에 대한 행동을 취합니다.
앱 내에서 메세지를 던지면 아무데서나 이 메세지를 받을 수 있게 하는 역할을 합니다.
보통 백그라운드 작업의 결과, 비동기 작업의 결과 등 현재 작업의 흐름과 다른 흐름의 작업으로부터 이벤트를 받을 때 사용합니다.

참고링크

@choidam choidam added the label Nov 20, 2020
@Juhyeoklee
Copy link
Collaborator

Notification Center

Notification Center는 Observer Pattern의 형태로 동작하며, Notification Center에 등록된 event가 발생하면 등록된 observer list를 스캔하고 등록 된 옵저버에 이벤트에 반응하도록 한다. 그리고 이러한 이벤트를 원하는 시점에 post하게 된다.

활용 방안

Notification Center는 싱글턴 패턴으로 화면상의 어느 위치에서나 이용할 수 있기 때문에 데이터가 여러곳에 전달될 때 유용하게 사용할 수 있고,
시스템 이벤트(키보드, 스크린 샷)같은 이벤트에 대응하기위하여도 사용한다.

@elesahich
Copy link
Collaborator

https://velog.io/@hanseop95/%EB%B2%88%EC%97%AD-Cocoa-Fundamentals-Guide-Notification 참조

동작 방식

  1. NotificationCenter 클래스와 Notification 구조체는 UI 독립적이며 Foundation 프레임워크에 있음
  2. 따라서 한 앱은 하나의 NotificationCenter를 가지게 됨
  3. Notification.Name은 여러 Notification의 이름을 저장하는 구조체
  4. Notification.Name 구조체의 특정 값을 옵저빙하거나 방출할 수 있음
    방식은 다음과 같다
    image
    무엇보다 one-to-many 관계가 되는 시점에서 방송국이라는 표현이 잘 맞음 (용도도 맞다고 생각합니다)

활용 방안

callback에는 여러 방법이 있는데, notification의 경우에는 다음과 같은 경우에 이점이 있다고 생각합니다.

  1. 그림과 같이 one - to - many 관계에서 최적화
  2. 시스템함수들이 조금 있습니다
    UIResponder Extensions (System Extensions)
    public class let keyboardWillShowNotification: NSNotification.Name
    public class let keyboardDidShowNotification: NSNotification.Name
    public class let keyboardWillHideNotification: NSNotification.Name
    public class let keyboardDidHideNotification: NSNotification.Name
    이런거 쓸 때
  3. 한 뷰가 너무너무 복잡스러운데 뎁스까지 깊어서 최상위 뷰의 이벤트가 가장 루트에 전달되어야 할때 (이렇게 짜면 고통스러웁니다)

조심할 점
deinitializing을 알아서 해주는데요 iOS9 이상에서는 그렇지만 제한조건이 있습니다
func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol

이런 block이 있는 함수들을 쓸때는 weak self 캡쳐링도 잘 하고,
deinit도 잘 시켜줘야 해요

stackoverflow
https://stackoverflow.com/questions/28689989/where-to-remove-observer-for-nsnotification-in-swift

@elesahich elesahich added the 승호 승호 label Nov 20, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment