2010-11-07 2 views
1

я после уведомления, как это в операции:iPhone развития: ноль USERINFO при получении уведомления

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 это объект, который содержит информацию ABOU загрузки, что в настоящее время в настоящее время загружены. 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. Что я делаю не так?

MrWHO

ответ

2

Так или иначе, вы, кажется, инициализация ваших USERINFO объекта неправильно. Указанная линия:

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

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

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

self.userInfo = userInfo; 

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

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

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

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

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

С:

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

Спасибо Вам! Вот и все: теперь это выглядит очевидно, конечно, я не мог этого видеть, когда просто смотрел на код. Спасибо за помощь! – MrWHO

Смежные вопросы