안녕하세요 후르륵짭짭 입니다!
이번에는 Notification에 대해 알아보려고 합니다!!
Notification은 말 그대로 알려주는 것을 의미합니다.
이전에 Delegate로 ViewController 간의 통신을 하게 만들었는데, 그것과 비슷하게 서로 데이터를 보내주고 통신 할 수 있도록 하는 걸
Notification이라 합니다!!
2020/11/04 - [Xcode/Swift - PlayGround] - PlayGround) Delegate와 Delegate Data Pass를 알아보자!
이 글을 보면 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
Notification 데이터 전송 방법 :
강제적으로 ViewDidLoad 호출:
stackoverflow.com/questions/12703659/force-viewdidload-to-fire-on-ios
강제적으로 ViewDidLoad 여러개 호출 :
stackoverflow.com/a/52046644/13065642
loadViewIfNeeded 란??? :
developer.apple.com/documentation/uikit/uiviewcontroller/1621446-loadviewifneeded
View가 머지?? :
developer.apple.com/documentation/uikit/uiviewcontroller/1621460-view?preferredLanguage=occ
DateFormatter 방법:
DateFormatter에서 String ->Date -> String 방법 :
stackoverflow.com/a/55320986/13065642
'Xcode > Swift - PlayGround' 카테고리의 다른 글
PlayGround) DateFormatter를 이용해서 날짜를 변경하자 (2) | 2020.12.18 |
---|---|
PlayGround ) Closure의 기능은 무엇인가? (0) | 2020.12.08 |
PlayGround) DispatchGroup이란??? (0) | 2020.11.08 |
PlayGround) IOS의 Unit Test에 대해 알아보자 (0) | 2020.11.05 |
PlayGround) Delegate와 Delegate Data Pass를 알아보자! (0) | 2020.11.04 |
댓글