Разработка iPhone: nil userInfo при получении уведомления - PullRequest
1 голос
/ 07 ноября 2010

Я публикую подобные уведомления в операции:

   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 - это свойство объекта, которое было инициализировано в части инициализации и хранится в течение всей операции.Он создан так:

 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.Что я делаю не так?

MrWHO

1 Ответ

2 голосов
/ 07 ноября 2010

Так или иначе, вы, кажется, неправильно инициализируете свой объект userInfo. Строка как дано:

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

Создает автоматически выпущенный NSDictionary и сохраняет его в локальной переменной. Значение не будет распространяться до вашей переменной-члена.

Предположим, что это фрагмент, а затем, например,

self.userInfo = userInfo;

для присвоения локального члена, сохраняя его при этом, тогда ваш код должен сгенерировать исключение в этой строке:

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

Так как он пытается мутировать неизменный объект. Поэтому гораздо более вероятно, что значение userInfo не сохраняется, и в этот момент вы обмениваетесь сообщениями.

Итак, я думаю, что - предполагая, что userInfo объявлен как свойство типа 'retain', вы хотите заменить:

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

С:

self.userInfo = [NSMutableDictionary dictionaryWithObject:targetURL 
                                                        forKey:@"state"];
...