Подтвердить что ты не робот

Как обновить ярлык пользовательского интерфейса из потока, отличного от пользовательского интерфейса, в iOS

Я новичок в разработке iOS, у меня есть простой объект -c класс "MoneyTimer.m" для запуска таймера, оттуда я хочу обновить метку пользовательского интерфейса с изменением значения таймера. Я хочу знать, как получить доступ к элементу пользовательского интерфейса из потока, отличного от UI? Я использую Xcode 4.2 и раскадровку.

В blackberry просто, получив блокировку событий, можно обновить пользовательский интерфейс из неинтерфейса.

//this the code from MyTimerClass

 {...
    if(nsTimerUp == nil){

        nsTimerUp = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(countUpH) userInfo:nil repeats: YES];
 ...}

(void) countUpH {

sumUp = sumUp + rateInSecH;
 **//from here i want to update the UI label **
...
}
4b9b3361

Ответ 1

Это самый быстрый и простой способ сделать это:

- (void) countUpH{

   sumUp = sumUp + rateInSecH;
   //Accessing UI Thread
   [[NSOperationQueue mainQueue] addOperationWithBlock:^{

      //Do any updates to your label here
      yourLabel.text = newText;

   }];
}

Если вы делаете это так, вам не нужно переключаться на другой метод.

Надеюсь, что это поможет.

Сэм

Ответ 2

Ваш вопрос не дает много информации или деталей, поэтому трудно точно знать, что вам нужно делать (например, если есть проблема с потоком и т.д.).

Во всяком случае, если ваш экземпляр MoneyTimer имеет ссылку на текущий viewController, вы можете использовать performSelectorOnMainThread.

//

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

Ответ 3

В прошлом я делал нечто идентичное.

Я использовал функцию для установки текста метки:

- (void)updateLabelText:(NSString *)newText {
    yourLabel.text = newText;
}

а затем вызвал эту функцию в основном потоке с помощью выполнитьSelectorOnMainThread

NSString* myText = @"new value";
[self performSelectorOnMainThread:(@selector)updateLabelText withObject:myText waitUntilDone:NO];

Ответ 4

Правильный способ:

- (void) countUpH  {
   sumUp = sumUp + rateInSecH;
   //Accessing UI Thread
   dispatch_async(dispatch_get_main_queue(), ^{

   //Do any updates to your label here
    yourLabel.text = newText;
   });
}

Ответ 5

Предполагая, что ярлык живет в одном классе:

    if(nsTimerUp == nil){
        nsTimerUp = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(countUpH) userInfo:nil repeats: YES];
    [self performSelectorOnMainThread:@selector(updateLabel)
                                           withObject:nil
                                        waitUntilDone:NO];

    }

-(void)updateLabel {
    self.myLabel.text = @"someValue";
}