Столкновение с NSThread при попытке анимировать ярлык - PullRequest
0 голосов
/ 21 ноября 2011

Я очень новичок в программировании на IOS, и у меня есть сомнения с NSThread. Моя проблема в том, что у меня есть UILabel в моем представлении, и я хочу скрыть и сделать его видимым последовательно через каждые 5 секунд. Для этой цели я использовал NSThread , как показано ниже.

[NSThread detachNewThreadSelector:@selector(animate) toTarget:self withObject:nil];

    -(void) animate
    {
        while(animateLabel){
               [NSThread sleepForTimeInterval:5];
                if(label.hidden){
                    NSLog(@"Label is hidden");
                    [label setHidden:NO];
                }else
                 { 
                    NSLog(@"Label is vissible");
                   [label setHidden:YES];
                   }


  }
}

Теперь я получаю "Метка скрыта" и "Метка видна" Последовательно в журнале через каждые 5 секунд. Но мой лейбл не скрывается.

Я сделал с NSTimer , и он работает.

Но в чем проблема с приведенным выше кодом? Если нет проблем с этим кодом, почему NSThread не может это сделать?

Ответы [ 3 ]

1 голос
/ 21 ноября 2011

Вместо этого вам нужно выполнить это в главном потоке.

Попробуйте это -

[NSThread performSelectorOnMainThread:@selector(animate) toTarget:self withObject:nil];

, поскольку у вас в то время как цикл while

удаляет sleep и добавляет runloop

[[NSRunLoop currentRunLoop] runUntilDate:(NSDate*)]
0 голосов
/ 21 ноября 2011

Плохо, не читал, что вы намеренно собирались сделать это с NSThread, вот как это сделать с NSTimer:

Если вы создаете NSTimer из основного потока, вам даже не нужно заниматься вопросами безопасности потоков.

объявляет NSTimer в файле заголовка, чтобы вы могли получить к нему доступ в случае, если хотите отменить его или что-то еще (я также предполагаю, что ваша метка называется 'mainLabel' и объявлена ​​правильно):

NSTimer *labelVisibilityTimer;
@property (nonatomic,retain) NSTimer *labelVisibilityTimer;

в файле реализации правильно синтезируйте таймер и инициализируйте его методом, который вызовет изменение видимости.

@synthesize labelVisibilityTimer;

- (void)viewDidLoad{
    self.labelVisibilityTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(toggleVisibilityOfLabel) userInfo:nil repeats:YES];
}

-(void)toggleVisibilityOfLabel{
    mainLabel.hidden = !mainLabel.hidden;
}


- (void)viewDidUnload{
    [super viewDidUnload];
    self.labelVisibilityTimer = nil;
}

- (void) dealloc{
    [super dealloc];
    [labelVisibilityTimer release];
}
0 голосов
/ 21 ноября 2011

Пользовательский интерфейс может быть изменен только основным потоком.вместо создания новой темы вы можете использовать селектор попробуйте это -

[self performSelectorOnMainThread:@selector(animate) withObject:nil afterDelay:5.0 ];
...