Как обновить ярлык пользовательского интерфейса из потока, отличного от пользовательского интерфейса, в 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 **
...
}
Ответы
Ответ 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";
}