2013-10-06 3 views
1

Я хочу обновлять текст моей метки каждый раз, когда получаю уведомление от nsmanageObjContext.setText в UIlabel после вызова уведомления не имеет эффекта

это мой код для добавления наблюдателя:

- (IBAction)requestFotPhoto { 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(updateLabel) name:NSManagedObjectContextDidSaveNotification 
              object:self.facebook.managedObjectContext]; 

и это способ для обновления метки:

-(void)updateLabel 
{ 
     NSString *text = [NSString stringWithFormat:@"Downalad %i pictures",[Photo NumeberOfAllPhotosFromContext:self.facebook.managedObjectContext]]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      //UIKIT method 
      NSLog(@"text %@",text); 
      [self.downlaodLabel setText:text]; 
     }); 
} 

я считать, что updateLabel является выполнение в другом потоке, так что я выполните инструкции по обновлению метки в основном потоке, но этот код не влияет. в чем проблема?

очевидно NSlog распечатать правильное сообщение!

спасибо!

+0

Вы видите какие-либо предупреждения? Я думаю, вы не можете использовать переменную, объявленную за пределами такого блока. –

+0

никаких предупреждений или ошибок. в другой ситуации я использую локальную переменную внутри блока, и все работает нормально. –

+0

Если вы не делаете что-то странное, методы 'IBAction' вызываются в основном потоке. Действительно ли 'downlaodLabel' что-то задает? – Wain

ответ

0

В вашей ситуации вам не нужно использовать dispatch_async, потому что обработчики уведомлений запускаются в основном потоке. Они исполняются в основном цикле в простые моменты - извините, если я ошибаюсь с техническими словами, английский для меня не является родным.

И еще одно: вы должны ссылаться на блоки self, потому что self указывает на ваш блок и блокирует точки до self - они не будут выпущены. Если вы действительно хотите это сделать, вы можете прочитать this question.

+0

если я оставляю dispatch_async то же самое! он не работает. возможно, проблема в том, что метод вызывает много времени, поэтому ярлык не успевает обновиться. –

+0

Установите точку останова - возможно, 'self.downlaodLabel == nil'? Это может быть, если ваша функция вызывается до того, как будет выведено представление. Вы также можете попробовать 'NSLog (@"% @ ", self.downlaodLabel.text)' сразу после установки значения. Если вы видите это значение, это означает, что после этого он меняет место в другом месте. – Stanislav

+0

Вы также можете попробовать обернуть свой метод в '[self performSelector: @selector (innerUpdateLabel) withObject: nil afterDelay: 0]' и посмотреть, что произойдет. – Stanislav

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