본문 바로가기
Xcode/Swift - PlayGround

PlayGround) Notification을 이용해서 데이터를 전송하자!

by 후르륵짭짭 2020. 11. 16.
728x90
반응형

 

 

안녕하세요 후르륵짭짭 입니다!

이번에는 Notification에 대해 알아보려고 합니다!!

Notification은 말 그대로 알려주는 것을 의미합니다.

이전에 Delegate로 ViewController 간의 통신을 하게 만들었는데, 그것과 비슷하게 서로 데이터를 보내주고 통신 할 수 있도록 하는 걸

Notification이라 합니다!!

2020/11/04 - [Xcode/Swift - PlayGround] - PlayGround) Delegate와 Delegate Data Pass를 알아보자!

 

PlayGround) Delegate와 Delegate Data Pass를 알아보자!

안녕하세요! 후르륵짭짭 입니다. 이번에는 Delegate와 Delegate를 활용해서 ViewController 간의 데이터 전송 방법을 배워보려 합니다. ViewController간에 DataPass 방법에는 총 3가지가 있습니다. 1. Notificat..

hururuek-chapchap.tistory.com

이 글을 보면 Notification 말고 Delegate로 데이터를 전송 하는 방법을 배울 수 있습니다!

 

** 실제로 해보기 **

일단 아래 처럼 TabBar를 이용해서 View를 구성해주세요.

일단 저희는 PickerView를 세번째 뷰에 만들어주고 노란색 버튼을 누르면 하늘색과 초록색 뷰에 있는 Label이 바뀌게 할 것 입니다!

일단 Notification의 가장 큰 장점은 Delegate와 Segue와 다르게 다양한 뷰에 데이터를 전송 할 수 있다는 큰 장점이 있습니다!!!

 

Notification은 Post와 observer로 구성 되어 있습니다.

Post는 이렇게 내용을 보내주는 것이고

Observer는  관찰자 또는 목격자를 의미합니다.  즉 받는 사람 입니다!

 

Notification은 이렇게 객체 자체와 값 두개를 모든 observer에게 보낼 수 있습니다.

NotificationCenter.default.post(name: 이름, object: 보내는객체, userInfo: 보내는 값)

이때 name에는 수많은 notification을 구별 할 수 있는 "이름"을 넣어주고 

object는 observer에게 보낼 객체 - 이것을 통해 그 객체의 프로퍼티나 메소드를 이용할 수 있습니다.

그리고 userInfo를 통해서 단순한 값

이렇게 할 수 있습니다.

 

참고로 name은 중복되서 사용 되기 때문에 아래 처럼 extension을 활용 해주면 더욱 간편하게 사용 할 수 있습니다.

 

이제 Observer를 보도록 하겠습니다.

NotificationCenter.default.addObserver(forName: .dateNotification, object: nil, queue: OperationQueue.main) { (notification) in}

이렇게 Observer는 NotificationCenter.default.addObserver(이름 , 다른 Notification에 보낼 객체, 수행할 쓰레드 ){수행할 작업}으로 구성되어 있습니다.

이때 NSObjectProtocol을 반환해주는데, 이것은 observer를 다루는데 사용 될 수 있습니다.

따라서 아래 처럼 전역변수로 받아서

var token : NSObjectProtocol?

 override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        
        if let token = token{
            NotificationCenter.default.removeObserver(token)
        }
        
    }

이렇게 더 이상 사용하지 않을 때 삭제 할 수 있습니다

 

만약에 post에서 object랑 userinfo를 보내주었다면

//object를 사용하는 방법
let viewController = notification.object as! ThridViewController

//userinfo를 사용하는 방법
let date = notification.userInfo?["date"] as! String

위에 처럼 사용 할 수 있습니다!

 

** 참고할 사항 **

1. ViewDidLoad()에서 호출하자

 override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        token = NotificationCenter.default.addObserver(forName: .dateNotification, object: nil, queue: OperationQueue.main) { (notification) in
        ...
        }
        
        
        }

만약에 위에 처럼 ViewDidLoad()가 아닌 ViewDidAppear 시전에 호출하게 된다면 Notification이 여러번 호출 하게 됩니다.

왜냐하면 ViewDidAppear()는 UI update 사이클이 발동 되면 매번 호출 되기 때문입니다.

따라서 Notification은 ViewDidLoad()에 호출하는 것이 메모리 차원에서 좋을 것 같습니다!

 

2. TabBar에서 여러개의 뷰를 강제적으로 Load() 해보자!

위에 처럼 tabBar나 navigation같은 경우는 하위 뷰를 가지고 있기 때문에, 위에 처럼 코드르 작성해주면 ViewDidLoad()를 강제적으로 호출 할 수 있씁니다.

 

3. DateFormatter 사용 방법

let formate = DateFormatter()
 formate.dateFormat = "MM-dd"
 let item = formate.date(from: "1-2")
 
 print(item)
 
 formate.dateFormat = "MM , dd"
 let newDate = formate.string(from:item!)
 print(newDate)
 
 String => Date => String
 
 문자열로 구성된 날짜를 원하는 방식으로 다시 변환 하기 위해서는
 DateFormatter를 이용해야한다.
 DateFormatter . dateFormat를 원하는 형식으로 만들어줘야한다.
 yyyy : 년도
 MM : 월 0 - 12 까지 모두 허용
 dd : 일 0 - 31 까지 모두 허용
 
 그리고 이것을 formate.date(string)를 사용해서 Date 형식으로 만들어 준다.
 하지만 이때 string은 우리가 앞에 설정한 형식이랑 동일해야한다.
 그리고 마지막에 formate.string(date)가 들어가면 된다.

 

소스 코드 :

github.com/HururuekChapChap/Xcode_TestProj/tree/master/Notification_Tuto/Notification_Tuto

 

참고 사이트 :

Notification의 Post란?:

developer.apple.com/documentation/foundation/notificationcenter/1410608-post

 

Apple Developer Documentation

 

developer.apple.com

Notification 데이터 전송 방법 :

gwangyonglee.tistory.com/31

 

[Swift] 노티피케이션 센터와 노티피케이션

iOS 환경에서 사용하는 옵저버 패턴을 사용하는 노티피케이션 센터와 노티피케이션에 대해 알아보려고 합니다. Notification 등록된 노티피케이션에 노티피케이션 센터를 통해 정보를 전달하기 위

gwangyonglee.tistory.com

 

강제적으로 ViewDidLoad 호출:

stackoverflow.com/questions/12703659/force-viewdidload-to-fire-on-ios

 

Force viewDidLoad to fire on iOS

I have two window app and while I present first window I would like the view in second window to load and prepare content for later in background. I've tried to use method loadView but Apple says ...

stackoverflow.com

강제적으로 ViewDidLoad 여러개 호출 :

stackoverflow.com/a/52046644/13065642

 

How to load all views in UITabBarController?

I have not found relevant and up to date answers in the posts related to this question. I would like to load all viewcontrollers on launch. Currently it launches as expected but when I tap on a ba...

stackoverflow.com

loadViewIfNeeded 란??? :

developer.apple.com/documentation/uikit/uiviewcontroller/1621446-loadviewifneeded

 

Apple Developer Documentation

 

developer.apple.com

View가 머지?? :

developer.apple.com/documentation/uikit/uiviewcontroller/1621460-view?preferredLanguage=occ

 

Apple Developer Documentation

 

developer.apple.com

 

DateFormatter 방법:

0miming.tistory.com/6

 

[iOS] DateFormatter

# Class # DateFormatter 날짜와 텍스트 표현 간에 변환되는 형식입니다. A formatter that converts between dates and their textual representations. 선언 Declaration class DateFormatter : Fomatter 개요 O..

0miming.tistory.com

DateFormatter에서 String ->Date -> String 방법 :

stackoverflow.com/a/55320986/13065642

 

How to convert String to Date to String in Swift?

I have this type of string, "2019-03-22", and want to convert it to this string, "March 22, 2019", in Swift. It looks simple and I tried a few different ways. But I haven't figured it out yet. Th...

stackoverflow.com

 

728x90
반응형

댓글