1

我在操作中发布这样的通知:

   DownloadStatus * status = [[DownloadStatus alloc] init];
   [status setMessage: @"Download started"];
   [status setStarted];
   [status setCompleteSize: [filesize intValue]];
   [userInfo setValue:status forKey:@"state"];
   [[NSNotificationCenter defaultCenter]
       postNotificationName:[targetURL absoluteString]
       object:nil userInfo:userInfo];
   [status release];

DownloadStatus 是一个对象,其中包含有关当前正在下载的下载的一些信息。userInfo 是已在 init 部分初始化的对象的属性,并在操作的整个过程中保留。它是这样创建的:

 NSDictionary * userInfo = [NSDictionary dictionaryWithObject:targetURL 
                                                             forKey:@"state"];

“targetURL”是一个 NSString,我使用它只是为了确保一切正常。当我收到事件时 - 我是这样注册的:

   [[NSNotificationCenter defaultCenter] 
       addObserver:self selector:@selector(downloadStatusUpdate:) 
       name:videoUrl 
       object:nil];

这里的“videoUrl”是一个包含正在下载的 url 的字符串,这样我就会收到关于我正在等待下载的 url 的通知。

选择器是这样实现的:

   - (void) downloadStatusUpdate:(NSNotification*) note   {

     NSDictionary * ui = note.userInfo; // Tried also [note userInfo]

     if ( ui == nil ) {
         DLog(@"Received an update message without userInfo!");
         return;
     }
     DownloadStatus * state = [[ui allValues] objectAtIndex:0];
     if ( state == nil ) {
         DLog(@"Received notification without state!");
         return;
     }
     DLog(@"Status message: %@", state.message);
     [state release], state = nil;
     [ui release], ui = nil;   }

但是这个选择器总是接收一个空的 userInfo。我究竟做错了什么?

世界卫生组织先生

4

1 回答 1

2

一种或另一种方式,您似乎错误地初始化了您的 userInfo 对象。给定的行:

NSDictionary * userInfo = [NSDictionary dictionaryWithObject:targetURL 
                                                        forKey:@"state"];

将创建一个自动发布的 NSDictionary 并将其存储到局部变量中。该值不会传播到您的成员变量。

假设这是一个片段,然后是例如

self.userInfo = userInfo;

要将本地分配给成员,同时保留它,那么您的代码应该在此行生成异常:

[userInfo setValue:status forKey:@"state"];

因为它试图改变一个不可变的对象。因此,userInfo 的值更有可能没有被存储,而此时您的消息传递为零。

所以,我认为 - 假设您将 userInfo 声明为“保留”类型属性,您想要替换:

NSDictionary * userInfo = [NSDictionary dictionaryWithObject:targetURL 
                                                        forKey:@"state"];

和:

self.userInfo = [NSMutableDictionary dictionaryWithObject:targetURL 
                                                        forKey:@"state"];
于 2010-11-07T19:41:59.903 回答