能否通过NSNotification将数组作为对象传递?

10

我可以通过使用协议和委托来实现这一点,但我想尝试使用NSNotification

我的任务是通过通知从一个视图向另一个视图发送一个NSMutableArray。是否可能实现?

[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:myArray];

那么,在接收器中,如何获取传递的myArray。我正在阅读并困惑于通知对象的userInfoobject

请就此问题给予建议。


是的,我确实尝试过,但当我捕获传递的数组时...我应该使用[notification object]并将其捕获到NSMutableArray中。那么userInfo呢?什么时候应该使用它? - tranvutuan
4个回答

32

NSNotification有一个名为userInfo的属性,它是一个NSDictionaryobject是发送NSNotificationNSObject。因此,当我设置NSNotification时,通常使用self作为object,因为self是发送NSNotificationNSObject对象。如果您想使用NSNotification传递NSArray,我会执行以下操作:

NSArray *myArray = ....;
NSDictionary *theInfo =
  [NSDictionary dictionaryWithObjectsAndKeys:myArray,@"myArray", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData"
                                                    object:self
                                                  userInfo:theInfo];

然后使用以下方法捕获它:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(doTheReload:)
                                             name:@"reloadData"
                                           object:sendingObject];

sendingObject 是发送 NSNotification 的对象。

最后,在 doTheReload: 中解码数组,使用:

NSArray  *theArray = [[notification userInfo] objectForKey:@"myArray"];

那对我总是起作用。祝你好运!


只是修改了一下,我所做的是[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doTheReload:) name:@"reloadData" object:[A class]];我加入了[A class]因为A是发布NSNotification的对象。但仍然没有效果...我正在考虑通过执行A *a = [[A alloc] init]来创建A类的对象,但我对此表示怀疑... - tranvutuan
1
不,你需要使用 self 发送它。你不会传递发送它的对象的类,而是传递发送它的对象的实际 id,然后你需要捕获它被发送的对象的实际 id。如果你不知道如何获取这些信息,可以使用 nil,但我不建议这样做。 - Justin Paulson
@JustinPaulson 如果我的控制器触发通知的路径与接收通知的对象不直接链接,是否通过appdelegate传递信息是最好的方式? - ThinkBonobo
@ThinkBonobo,这取决于你想如何实现。如果你能成功捕获通知,那么最好使用它来传递userInfo。 - Justin Paulson
非常感谢 @Justin Paulson :) ,我传递了一个空对象,它对我起作用了。 - Mihir Oza
显示剩余2条评论

2

您应该使用 userInfo。它是用于与通知一起发送的其它数据。参数 object 是指触发事件的对象。例如,如果您想监视某个 MPMoviePlayerController(而不是其他的),那么您只需要注册它的通知(通过参数 object)。


如果他为自己发布通知,他可以同时使用“object”和“userInfo”。只需要知道他用哪个来做什么就可以了。 :) - holex
userInfo 是一个 NSDictionary。然而,我正在传递 NSMutableArray。像你说的那样,我应该创建一个 NSDictionary 来保存我的数组吗? - tranvutuan
2
我不知道为什么这个被踩了。这正是正确的答案。你将NSArray存储在userInfo字典中。正如@borrrden所说,'object'应该始终是发布通知的对象。数组没有发布通知,因此它不应该是'object'。未能始终遵循这个约定是非常令人沮丧的错误源(通常的症状是奇怪的“不响应选择器”崩溃)。 - Rob Napier
@ttran 是的,它是一个字典,让您可以方便地存储多个信息。将您的数组添加到字典中(以及任何您想要的内容)。 - borrrden
@borrrden:我正在考虑是否应该创建一个字典来保存我的对象,比如我的数组myArray。现在我知道该怎么做了。谢谢 - tranvutuan

1

这是非常一致的,因为当您使用-postNotificationName:object:userInfo:方法发布任何通知时,对象object,而userInfouserInfo

是的,您可以通过NSNotificationCenter发布NSObject的任何子类。


1

Swift 4,Swift 5

NotificationCenter.default.post(name: Notification.Name("favoriteIsDeleted"), object: [message, self.viewModel.deleteSuccessIcon])

@objc func favoriteIsDeleted(notification: Notification) {
    guard let object = notification.object as? [String?], let message = object[0], let deleteSuccessIcon = object[1] else { return }
    // Code here ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接