在Swift中使用NSNotificationCenter

NSNotificationCenter可以被视为在您的应用程序中传达信息的工具。 与推送通知或本地通知不同,在这些通知中,您会通知用户您希望他们接收的任何内容,NSNotificationCenter允许我们根据应用程序中发生的操作在类和/或结构之间发送和接收信息。

简而言之,可以将NSNotificationCenter视为广播公司,我们可以收听不同的电台或频道以收听任何更改。

NotificationCenter.default是所有通知发布和观察对象的位置。 每个通知都必须具有一种独特的方式来标识自己,如果继续进行类比,则该方式将代表我们要进入的频道。 同样,如果我们要观察或收听任何频道,则可以通过NotificationCenter.default调用对我们可用的观察方法,并基于此侦听执行某种类型的操作。

我创建了一个简单的应用程序,该应用程序演示了NSNotifcationCenter的用法,以便我们可以更好地理解代码中的形式以及它的实际工作方式。 如果您像我一样,并且是动手学习者,请随时进行编码。

在此应用程序中,我嵌入了导航控制器,并连接了所需的所有IBOutlet和IBAction。 该应用程序的目标是显示从其他视图控制器中选择的目的地的名称。

首先,我们将创建在NotificationCenter在给定通道中检测到更改时将执行的操作。

在我们的案例中,我们正在创建两个函数,这些函数将更改ChoiceDestinationVC中的城市标签。

  func setToPeru(notification:NSNotification){ 
  cityChosenLabel.text =“秘鲁” 
  } 
  func setToArgentina(notfication:NSNotification){ 
  cityChosenLabel.text =“阿根廷” 
  } 

每个函数都会将cityChosenLabel设置cityChosenLabel相应的文本。 我们将不会对这些功能做任何事情,但是很快,当我们开始在应用程序中进行观察时,我们将对其进行调用。

还记得我提到每个通知应具有唯一身份吗? 好了,我在Notification.Name上创建了一个扩展,并在每个通道的名称上添加了两个静态属性。 通常,您可以手动键入包含您要在调用observe或post方法时用于通知的名称的字符串,但这可以帮助我们避免错误,并减少因拼写错误而导致错误的空间。

 扩展Notification.Name { 
 静态让秘鲁= Notification.Name(“秘鲁”) 
静态让阿根廷= Notification.Name(“阿根廷”)
  } 

之后,我们将在ViewDidLoad中添加观察方法,这些方法将侦听其指定的通道并根据每个通道执行操作。

  NotificationCenter.default.addObserver(自身,选择器:#selector(setToPeru(notification :)),名称:.peru,对象:无) 
  NotificationCenter.default.addObserver(自身,选择器:#selector(setToArgentina(notfication :)),名称:.argentina,对象:nil) 

我们的第一个观察者方法将执行我们上面创建的功能setToPeru(notification:) ,如果通知已发布到.peru通道,我们将在其中更改标签的文本。 然后将相同的内容应用于侦听并将标签文本更改为阿根廷的setToArgentina(notification:)

从这里开始,我们进入下一个视图控制器DestinationVC。 当有人单击任一按钮时,我们将在此处发布通知。

  @IBAction func peruButton(_ sender:Any){ 
  NotificationCenter.default.post(名称:.peru,对象:无) 
  } 
  @IBAction func argentinaButton(_ sender:Any){ 
  NotificationCenter.default.post(name:.argentina,object:nil 
  } 

如果用户单击peruButton ,我们将在.peru通道中发布通知,同样的内容将应用到带有其相应通道的argentinaButton

现在,我们可以运行我们的应用程序,然后查看城市标签中的文本会根据单击的按钮而变化! 尽管此示例很简单,但是使用NSNotificationCenter的方法有很多。 当一个应用程序需要用户登录并且希望根据用户是否登录执行某项操作时,这将非常有用。