метод "жди своей очереди"! - PullRequest
0 голосов
/ 21 мая 2011

Привет, когда происходят определенные события, я вызываю ряд методов (разблокированных трофеев в игре), они появляются и исчезают в подвиде.Сбой (справедливо) происходит, когда эти события происходят одновременно и перекрываются.Как мне убедиться, что «жди свою очередь :)»?спасибо

-(void)trofeiLaunch:(int)x {


    CGRect loseFrame = CGRectMake(0, 0, 480, 320);
    TrofeoView = [[UIView alloc] initWithFrame:loseFrame];
    TrofeoView.alpha = 0.0;
    [UIView beginAnimations:nil context:self];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    [UIView setAnimationDuration:0.5];
    [UIImageView setAnimationDelegate:self];
    TrofeoView.alpha = 1.0;
    [UIView setAnimationDidStopSelector:@selector(bridgeTrofei)];
    [UIView commitAnimations];
    [self.view addSubview:TrofeoView];
    [TrofeoView release];

            ....

}

-(void)bridgeTrofei {

TrofeoView.alpha = 1.0;
[UIView beginAnimations:nil context:self];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelegate:self];
TrofeoView.alpha = 0.0;
[UIView commitAnimations];
[self performSelector:@selector(deleteTrofei) withObject:self afterDelay:1.0];

}


-(void)deleteTrofei {


[TrofeoView removeFromSuperview];

NSLog(@"delete");

}

Сбой (справедливо) происходит, когда эти события происходят одновременно и перекрываются.Как мне убедиться, что «жди свою очередь :)»?спасибо

1 Ответ

1 голос
/ 21 мая 2011

Если вторая анимация запускается до завершения первой анимации, TrofeoView будет переназначена, и вы потеряете предыдущую ссылку. Вы также игнорируете правила управления памятью, когда выпускаете TrofeoView в методе 'trofeiLaunch: `. Вы используете эту переменную позже, получив право собственности. Вы должны освобождать объект только в том случае, если с ним покончено.

Я думаю, что самая важная вещь на этом пути - убедиться, что три метода ссылаются на правильный объект. Первый по умолчанию в порядке, поэтому вам нужно обработать следующие два. Я изменил ваш код, чтобы сделать это.

- (IBAction)start {

    animatingView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
    animatingView.backgroundColor = [UIColor greenColor];
    animatingView.alpha = 0.0;
    [UIView beginAnimations:@"Trophy Display" context:animatingView];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    [UIView setAnimationDuration:0.5];
    [UIImageView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
    animatingView.alpha = 1.0;
    [UIView commitAnimations];
    [self.window addSubview:animatingView];
}

- (void)animationDidStop:(NSString*)animationID finished:(NSNumber*)finished context:(void *)context {

    if ( [animationID isEqualToString:@"Trophy Display"] ) {
        UIView *aView = (UIView *)context;

        [UIView beginAnimations:nil context:aView];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationDelegate:self];
        aView.alpha = 0.0;
        [UIView commitAnimations];
        [self performSelector:@selector(finishAnimation:) withObject:aView afterDelay:1.0];
    }
}

- (void)finishAnimation:(UIView*)aView {
    [aView removeFromSuperview];
    [aView release];
}

Я передаю представление через context второму методу и withObject: часть третьему методу. Я надеюсь, что код говорит сам за себя. Дайте мне знать, если вы этого не получите.

Следующий пункт касается того, является ли это правильным путем. Вы не можете управлять этим с помощью массива? Нажмите только, если на дисплее нет изображения.

...