NotificationCenter

10999 ワード

NotificationCenter


通知を送信することによって.
登録された観察者に情報を伝える.
class NotificationCenter : NSObject

NotificationCenterを使用する理由


他のオブジェクトの状態が変化するたびに、何か行動を取ろうとするときに使用します.
nortification centerは設計モードにおけるファイバモードの1つである.
光ファイバモードはKVO、Property Observerなどがあります.ファイバモードは、ViewControllerにObserverがあり、モデルにPublisherがあるMVCモードで利用可能です.
これにより,ViewControllerのタイプを知る必要がなく,自己状態が変化したときに他の人に渡すだけで,互いの依存性を低下させることができる.また、複数のViewControllerは、1つのモデルを変更できます.

ファイバモードとは?


観察中のオブジェクトで発生したイベントを複数の異なるオブジェクトに通知するメカニズムを定義できる設計モード.

NotificationCenterの使用方法


では、NotificationCenterの使い方を見てみましょう.
  • NotificationCenter = .default:テレビ局宣言
  • Notification.Name("방송이름"):放送宣言
  • NotificationCenter.post(name: 2번, object: nil):post送信関数内で宣言
  • NotificationCenter.addObserver(self, selector: #selector(5번), name: 2번, object: nil):後継タイプ内宣言
  • @objc:post受信後に実行する関数で宣言
  • 最初は、コードが散乱していて、本当に混同されていましたが、操作方法を知ってから、分かりやすくなりました.
    まずラジオ局を宣言します(NotificationCenterは単一周として定義され、タイプproperties.defaultを使用してインスタンスを取得します.)
    そしてどのような番組を作るかを決め、番組名を発表します.このブロードキャスト名をpost関数のパラメータとして渡します.
    post関数は、あることを実行するときに実行された情報を送信する関数です.
    この関数から送信された情報を受信するために、受信者はobserverを登録する必要がある.
    受信postのタイプでaddObserverを宣言し、ブロードキャスト名をパラメータとして渡し、ブロードキャストを受信した後に実行する関数も渡します.
    コンパイラが検索できるように、ブロードキャストを受信した後に実行する関数に@objcを追加します.
    サンプルコード
    import UIKit
    
    //1st 어떤 방송을 보낼지
    let didPressButton: Notification.Name = Notification.Name("버튼누름")
    let notificationCenter: NotificationCenter = .default
    
    // Model
    // 정보가 바뀌지 않으니 구조체가 나음 (클래스보다)
    struct Registrant {
        let name: String
        let phoneNumber: String
        
        
    }
    
    class ViewController: UIViewController {
        
        @IBOutlet weak var nameTextField: UITextField!
        @IBOutlet weak var phoneNumberTextField: UITextField!
        
        @IBOutlet weak var nameLabel: UILabel!
        @IBOutlet weak var phoneNumberLabel: UILabel!
        
    
        // Model
        var registrantList: [Registrant] = []
        
        
        override func viewDidLoad() {
            super.viewDidLoad()
            //구독신청 4???
            notificationCenter.addObserver(self,
                                            selector: #selector(showInfo), //[name]방송을 들으면 [selector]를 실행하겠다!
                                            name: didPressButton,
                                            object: nil)
        }
        
        //controller
        @IBAction func hitRegisterButton(_ sender: Any) {
            register()
            
            //view
            nameTextField.text = ""
            phoneNumberTextField.text = ""
        }
        
        @IBAction func hitCheckButton(_ sender: Any) {
        
        }
        
        @objc
        func showInfo() {
            //방송을 듣고나서 해야할 일 3
            let currentIndex = registrantList.count - 1
            nameLabel.text = registrantList[currentIndex].name
            phoneNumberLabel.text = registrantList[currentIndex].phoneNumber
        }
        
        
        
        func register() {
            guard let nameText = nameTextField.text else {
                return
            }
            
            guard let phoneNumberText = phoneNumberTextField.text else {
                return
            }
            
            let personalInfo = Registrant(name: nameText, phoneNumber: phoneNumberText)
            registrantList.append(personalInfo)
            
            // 배열에 연락처 추가한 후에 방송해달라고 방송국에게 요청 2
            notificationCenter.post(name: didPressButton, object: nil)
        }
    }