【问题标题】:NSNotification object being sent is (null)?正在发送的 NSNotification 对象是(空)?
【发布时间】:2023-03-19 01:42:02
【问题描述】:

当我从套接字接收数据并通过 NSNotificationCenter 将数据传递给另一个 VC 时,传递的对象总是记录 (null),尽管该对象存在于另一个类中。

这是我传递数据的地方。

更新:

   -(void) initSIOSocket {
    [SIOSocket socketWithHost:@"http://192.168.1.4:8080" response:^(SIOSocket *socket) {

            self.socket = socket;
            NSLog(@"%@ from initSIOSocket", self.socket);

            [self.socket on:@"q_update_B" callback:^(NSArray *args) {


            NSArray *tracks = [args objectAtIndex:0];

            [[NSNotificationCenter defaultCenter] postNotificationName:@"qUpdateB" object:nil userInfo:[NSDictionary dictionaryWithObject:tracks forKey:@"tracksData"]];

        }];

..

- (void)receiveUpdateBNotification:(NSNotification *)notification
{
    // Do parse respone data method and update yourTableViewData

    NSArray *tracks = [[notification userInfo] objectForKey:@"tracksData"];
    NSLog(@"%@", tracks);
    self.tracks = tracks;
    [self.tableView reloadData];
}

控制台仍然记录为(空)对象。通知成功,没有数据发送。

【问题讨论】:

  • 您可以尝试像这样初始化您的轨道数组:NSArray *tracks = [[NSArray alloc] initWithArray:[args objectAtIndex:0]];。因为我怀疑 track 数组正在被释放。
  • 仍然无法工作@AdilSoomro
  • 你可以试试NSLog(@"userInfo: %@", notification.userInfo);

标签: ios objective-c sockets nsnotificationcenter


【解决方案1】:

要使用NSNotification 传递数据,您需要使用userInfo 字典。

像这样发布:

[[NSNotificationCenter defaultCenter] postNotificationName:@"qUpdateB" object:nil userInfo:[NSDictionary dictionaryWithObject:tracks forKey:@"MyData"]];

并使用以下方法检索它:

- (void)receiveUpdateBNotification:(NSNotification *)notification
{
    self.tracks = [[notification userInfo] objectForKey:@"MyData"];
    [self.tableView reloadData];
}

对象属性不适用于传递数据。

对象

与通知关联的对象。 (只读)声明

@property(readonly, retain) id object Discussion;

这通常是发布此通知的对象。它可能为零。

通常您使用此方法来找出通知的对象 适用于您收到通知的时间。

例如,假设您注册了一个对象来接收 消息handlePortDeath:发布“PortInvalid”通知时 到通知中心,handlePortDeath: 需要访问 监视现在无效端口的对象。处理端口死亡: 可以检索该对象,如下所示:

- (void)handlePortDeath:(NSNotification *)notification
{
  ...
  [self reclaimResourcesForPort:notification.object];
  ...
}

Reference

【讨论】:

  • 嗯..它仍然是空的。
  • @Andy: 检查tracks = [args objectAtIndex:0]; 是否为空。另外,如果你这样写,你不需要分配初始化那个变量
  • 好吧,这是有道理的。我应该如何将我从 Singleton 上的套接字接收到的数据传递给 viewcontroller 并在收到事件时重新加载数据?
  • @Andy:目前的方式还可以,你也可以使用KVO,因为你有一个单例。
【解决方案2】:

我需要使用我的 Singleton 来使用 NSNotificationCenter 传递数据,就像这样。

-(void) initSIOSocket {
    [SIOSocket socketWithHost:@"http://192.168.1.4:8080" response:^(SIOSocket *socket) {

            self.socket = socket;
            NSLog(@"%@ from initSIOSocket", self.socket);

            [self.socket on:@"q_update_B" callback:^(NSArray *args) {


            NSArray *tracks = [args objectAtIndex:0];
            self.setListTracks = tracks;
            [[NSNotificationCenter defaultCenter] postNotificationName:@"qUpdateB" object:nil];

        }];


    }];

}

..

- (void)receiveUpdateBNotification:(NSNotification *)notification
{
    if ([[notification name] isEqualToString:@"qUpdateB"])
        NSLog (@"Successfully received the test notification!");
    // Do parse respone data method and update yourTableViewData
    NSArray *tracks = [[SocketKeeperSingleton sharedInstance]setListTracks];
    self.tracks = tracks;
    [self.tableView reloadData];
}

【讨论】:

  • 这不是你需要做的。没有理由可以将数据与通知一起传递。
  • 你能提供一个答案吗?如果不为零,我似乎无法让我通过通知。另外,这种方法有什么问题? @rmaddy
  • 另一个答案告诉你正确的方法。你只需要弄清楚为什么它不适合你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多