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)
}
}
Reference
この問題について(NotificationCenter), 我々は、より多くの情報をここで見つけました https://velog.io/@dev_jane/NotificationCenterテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol