-3

对于两个不同的通知,我基本上有相同的代码。第一个是正确返回我的数据,但第二个是 nil。这可能是一个愚蠢的问题,但可能是因为我对两者都使用了相同的 NSNotificationCenter 吗?

NSNotificationCenter *note = [NSNotificationCenter defaultCenter];
[note addObserver:self selector:@selector(onProcessedReady:) name:@"Processed" object:nil];
[note addObserver:self selector:@selector(onGeneratedReady:) name:@"Generated" object:nil];

这是我为 NSNotification 回调设置数据的地方:

NSMutableDictionary *data = [NSMutableDictionary dictionaryWithCapacity:1];

[data setObject:self.templateData forKey:@"Template"];

NSNotificationCenter *templateNote = [NSNotificationCenter defaultCenter];
[templateNote postNotificationName:@"TemplateGenerated" object:nil userInfo:data];

<-- 数据在这里看起来不错。

这是回调:

-(void) onGeneratedReady:(NSNotification *)note  ///  <-- note is nil
{
    if ([note.name isEqualToString:@"TemplateGenerated"])
    {
        NSDictionary *userData = note.userInfo;
        TemplateData *templateData = [userData objectForKey:@"Template"];
        NSLog(@"what is in userData?");

    }
}

需要注意的是对象'self.templateData'是我创建的一个对象类。

@property (nonatomic, strong) TemplateData *templateData;

为了确保我的对象'self.templateData'不是问题,我尝试了以下方法,但回调中返回的注释仍然为零。

NSMutableDictionary *data = [NSMutableDictionary dictionaryWithCapacity:1];    
// [data setObject:self.template forKey:@"Template"];
[data setObject:@"I am so happy" forKey:@"NotHappy"];

NSNotificationCenter *templateNote = [NSNotificationCenter defaultCenter];
[templateNote postNotificationName:@"TemplateGenerated" object:nil userInfo:data];

数据在这里看起来不错。我有一个键/值对

[0] = @"NotHappy" : @"I am so happy"
  key = (__NSCFConstantString *) @"NotHappy"
  value = (__NSCFConstantString *) @"I am so happy"

这是回调:

-(void) onGeneratedReady:(NSNotification *)note  ///  <-- note is nil
{
    if ([note.name isEqualToString:@"TemplateGenerated"])
    {
        NSDictionary *userData = note.userInfo;
        TemplateData *templateData = [userData objectForKey:@"Template"];
        NSLog(@"what is in userData?");

    }
}
4

2 回答 2

0

note只是对[NSNotificationCenter defaultCenter]您调用该addObserver:selector:name:object:方法的引用。使用同一个引用没有问题,其实你可以直接写

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onProcessedReady:) name:@"Processed" object:nil];

目前尚不清楚您在templateData属性中放置了什么,也不清楚您实际在何处发布名为“Generated”的通知,该通知通知 self 并运行-onGeneratedReady:

于 2013-11-12T22:44:42.980 回答
0

真实答案!!!

我在 NSNotificationCenter 中返回了一个对象,但该对象没有强指针,并且在返回回调之前我丢失了我的对象。

我希望这篇文章对将来的人有所帮助:-)

于 2013-11-13T00:18:12.833 回答