[解決済み] swift 3.0のNotificationCenterとswift 2.0のNSNotificationCenterを使用してデータを渡すにはどうすればよいですか?
質問
を実装しています。
socket.io
を、iosアプリのSwiftに組み込んでいます。
現在、いくつかのパネルでサーバーをリッスンして、メッセージの着信を待っています。そのために
getChatMessage
という関数が各パネルにあります。
func getChatMessage(){
SocketIOManager.sharedInstance.getChatMessage { (messageInfo) -> Void in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//do sth depending on which panel user is
})
}
}
しかし、これは間違ったアプローチであることに気づいたので、変更する必要があります。現在では、受信メッセージのリッスンを一度だけ開始し、メッセージが来たら、それをリッスンするパネルにこのメッセージを渡したいのです。
そこで、NSNotificationCenterを介して着信メッセージを渡したいのです。今までは、何かが起こったという情報を渡すことはできましたが、データそのものを渡すことはできませんでした。それをやっていたのは
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.showSpinningWheel(_:)), name: showSpinner, object: nil)
という関数を持っていました。
func showSpinningWheel(notification: NSNotification) {
}
と、いつでも呼びたい時にしていました。
NSNotificationCenter.defaultCenter().postNotificationName(hideSpinner, object: self)
では、どのようにすればオブジェクトを渡すことができるのでしょうか。
messageInfo
を呼び出し、呼び出される関数に含めることができますか?
どのように解決するのですか?
Swift 2.0
情報を渡すには
userInfo
は、[NSObject : AnyObject] 型のオプションの Dictionary ですか?
let imageDataDict:[String: UIImage] = ["image": image]
// Post a notification
NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: nil, userInfo: imageDataDict)
// Register to receive notification in your class
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: notificationName, object: nil)
// handle notification
func showSpinningWheel(notification: NSNotification) {
if let image = notification.userInfo?["image"] as? UIImage {
// do something with your image
}
}
Swift 3.0、4.0、5.0バージョン以上
userInfo は、引数として [AnyHashable: Any]? を取るようになり、Swift では辞書リテラルとして提供されるようになりました。
let imageDataDict:[String: UIImage] = ["image": image]
// post a notification
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: imageDataDict)
// `default` is now a property, not a method call
// Register to receive notification in your class
NotificationCenter.default.addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)
// handle notification
// For swift 4.0 and above put @objc attribute in front of function Definition
func showSpinningWheel(_ notification: NSNotification) {
if let image = notification.userInfo?["image"] as? UIImage {
// do something with your image
}
}
NOTE
Notificationの「名前」は文字列ではなくなり、Notification.Name型になりました。
NSNotification.Name(rawValue: "notificationName")
また、Notification.Nameを拡張して、独自の通知を作成することもできます。
extension Notification.Name {
static let myNotification = Notification.Name("myNotification")
}
// and post notification like this
NotificationCenter.default.post(name: .myNotification, object: nil)
関連
-
制御が非ボイド関数の終了に達する
-
[解決済み] 使用しているSwiftのバージョンを確認するにはどうすればよいですか?
-
[解決済み] Swiftでindexとelementでループを反復させる方法
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] Swiftを使用してアプリのバージョンとビルド番号を取得するにはどうすればよいですか?
-
[解決済み] アプリのプレビュー用にiOSシミュレータのビデオをキャプチャー
-
[解決済み] UILabelで複数行のテキストを表示する
-
[解決済み] iOS 13でダークモードをオプトアウトすることは可能ですか?
-
[解決済み] Cocoapods警告 - CocoaPodsがプロジェクトの基本構成を設定しなかった理由は、プロジェクトに既にカスタム構成が設定されているためです。
-
[解決済み] NSNotificationCenterでオブジェクトを渡す方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
IOS8 Development Guide Error Thread 1: signal SIGABRT
-
[解決済み] UIViewController のビューが表示されているかどうかを確認する方法
-
[解決済み] iPhone UITextField - プレースホルダーの文字色を変更する
-
[解決済み] UITextViewのサイズをコンテンツに合わせるには?
-
[解決済み] iOSとWatchKitで画像のtintColorを変更する方法
-
[解決済み] NSNotificationCenterのaddObserver in Swift
-
[解決済み] コア・データ エンティティの全インスタンスを削除する最短の方法
-
[解決済み] Swiftの配列を文字列に変換するには?
-
[解決済み] UITextBorderStyleNoneを使用してUITextFieldのパディングを設定する
-
[解決済み] NSNotificationCenterでオブジェクトを渡す方法