iPhone: работает ли селектор остановки анимации в главном потоке? - PullRequest
1 голос
/ 11 августа 2010

Из документации ясно, что анимации (запускаемые с помощью [UIView commitAnimations]) выполняются в отдельном потоке.Что не ясно (для меня, во всяком случае), так это то, выполняется ли animationDidStopSelector в основном потоке (UI) или в том же потоке, что и анимация.

Учитывая следующий код:

- (void) doSomethingCool {
 // Fade out someView
 [UIView beginAnimations:@"myAnimation" context:nil];
 [UIView setAnimationDelegate:self];
 [UIView setAnimationDidStopSelector:@selector(animationDone:finished:context:)];
 someView.alpha = 0.0;
 [UIView commitAnimations];
}

- (void) animationDone:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
 if( [animationID isEqual:@"myAnimation"] ) {
  [someView removeFromSuperview];
 }
}

Я слышал, что доступ к элементам пользовательского интерфейса в потоке, отличном от основного потока, "вообще плох", поэтому, если вызов animationDone происходит надругой поток, тогда приведенный выше код будет делать плохие вещи, да?

Кажется, не делать плохих вещей.Но я преследовал случайный случайный сбой, который происходит после этой анимации, и мне интересно, есть ли какая-то проблема с многопоточностью.

1 Ответ

1 голос
/ 11 августа 2010

Похоже, что они выполняются в основном потоке, что доказано несколькими удачно расположенными вызовами NSLog.

- (void) doSomethingCool {
    // Fade out someView
    NSLog( @"executing beginAnimations on thread %@", [NSThread currentThread] );
    [UIView beginAnimations:@"myAnimation" context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDone:finished:context:)];
    someView.alpha = 0.0;
    [UIView commitAnimations];
}

- (void) animationDone:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    NSLog( @"executing animationDone on thread %@", [NSThread currentThread] );
    if( [animationID isEqual:@"myAnimation"] ) {
        [someView removeFromSuperview];
    }
}

… который выводит:

executing beginAnimations on thread <NSThread: 0x6b10860>{name = (null), num = 1}
executing animationDone on thread <NSThread: 0x6b10860>{name = (null), num = 1}

... что заставляет меня задуматься, где на самом деле моя авария. : P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...