【问题标题】:iPhone: Wait until UIView animation is FinishediPhone:等到 UIView 动画完成
【发布时间】:2012-08-17 15:54:29
【问题描述】:

我正在为 iPhone 创建一个回合制游戏,其中包含回合之间的动画,我想等待代码中的 [UIView animateWithDuration:...] 方法调用。有没有办法让这个调用同步而不是异步?目前我正在做的是......

// Some code... 

NSConditionLock *conditionLock = [[NSConditionLock alloc] initWithCondition:0];

dispatch_sync(dispatch_get_main_queue(), ^{
    [UIView animateWithDuration:1 
                     animations:^{
                         // some animation
                     } 
                     completion:^(BOOL finished){
                         [conditionLock lock];
                         [conditionLock unlockWithCondition:1]; 
                     }]; 
});


// forces thread to wait until completion block is called
[conditionLock lockWhenCondition:1]; 


// More code... 

因此在上面的代码中,“// More code...”只有在动画完全完成后才会到达。显然,此代码必须在辅助线程上运行,并且可以按我的意愿工作。但是,我有一种感觉,将 NSConditionLock 与 gcd 结合使用是不好的形式,并且以这种方式阻塞辅助线程对于性能来说并不是最佳的。我当前的代码还可以吗,还是有更好的方法来做到这一点?谢谢。

编辑: 关键是“// more code...”是内联的,而不是在完成块中。 真的我想知道的是,将 NSConditionLock 与 GCD 结合使用是否可以,如果不是更好的方法是什么?

【问题讨论】:

  • 这种方法的问题不是你在辅助(即不是主)线程上运行“一些动画”吗?顺便说一句,是什么(参考)让您认为将 NSConditionLock 与 GCD 结合是不好的形式?

标签: iphone objective-c grand-central-dispatch uiviewanimation


【解决方案1】:

我只是将“//更多代码”放在另一个方法中,然后在完成块中调用该方法。这将确保只有在动画完成后才会触发您的代码。

【讨论】:

  • 会起作用,但是在我的情况下,这将导致许多动画必须以这种方式链接,从而使代码的组织性和维护难度大大降低。
猜你喜欢
  • 2015-07-17
  • 2013-01-21
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
相关资源
最近更新 更多