IOS 动画 多线程 animationDidStop

在尝试通过多线程在类A中启动一个在其他ViewController上执行的动画时,发现动画完成后不会调用animationDidStop方法。问题在于线程在动画完成前已退出,导致animationDidStop无法执行。使用定时器可以解决这个问题,但作者对具体原理尚不清楚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说一下我想做什么:
我想要在一个类A中调用另一个viewcontroler显示动画,在动画执行完之后类A继续执行


我当前的做法:
在类A中新建线程,线程中调用动画函数,并在线程前加锁,在动画执行完之后调用animationDidStop解锁。
遇到的问题:
执行完之后不会调用animationDidStop,但是如果我使用定时则可以调用animationDidStop


以下是我大致的代码:
//类A:
                [_lock lock];
                [NSThread detachNewThreadSelector:@selector(moveChess) toTarget:self withObject:nil];
                [_lock lock];
                NSLog(@"_lock locked");
                [_lock unlock];
/*使用定时则可以调用animationDidStop
  [NSThread detachNewThreadSelector:@selector(moveChess) toTarget:self withObject:nil];
[NSThread sleepForTimeInterval:0.5f];
*/
//moveChess
               -(void)moveChess{
                          NSLog(@"moveChess... ...");
                           [self->_delegate moveChess:_preTag toTag:_tag];
                 }
 
//viewcontroler
//委托方法:移动棋子动画
-(void)moveChess:(int64_t)fromTag toTag:(int64_t)toTag{
    UIButton * btn1=(UIButton*)[self.view viewWithTag:fromTag];
    UIButton * btn2=(UIButton*)[self.view viewWithTag:toTag];
    CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"position"];
    anima.fromValue = [NSValue valueWithCGPoint:btn1.center];
    anima.toValue = [NSValue valueWithCGPoint:btn2.center];
    anima.duration = 0.5f;
    [_chessBtn[fromTag%100].layer addAnimation:anima forKey:@"moveChessAnimation"];
}
//
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    NSLog(@"fdsafdsa1");
    [self->_game->_lock unlock];
    NSLog(@"unlock");
}
//



animationDidStop不会调用的原因:
首先,动画效果在新建的线程中,线程会在-(void)moveChess:(int64_t)fromTag toTag:(int64_t)toTag执行完之后直接退出;
而animationDidStop比较特殊会被延后执行(这个感觉就像UI被改变时界面并不会即时的做出相应的变化);
他并不像一般的调用函数,我们可以看做是一个定时任务,而线程退出之后定时任务就会取消掉,所以animationDidStop最后没有被调用。。
(以上是我个人从现象推出来的结论,具体的原理并不清楚,只是当做个人笔记)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值