我正在动画一个视图(通过显示它),之后我需要发布一个通知(动画完成后)。无论应用程序的设计方式如何,当视图被隐藏(通过动画)时,会发出另一个通知。所以本质上我有一个'showView‘和一个'hideView’方法。每个人都这样做:
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
[context setDuration: 0.25];
[[myView animator] setAlphaValue: 0];
} completionHandler:^{
// post notification now
}];问题是,在后台的另一个线程中,我有一个定期计时器,它执行“健全性检查”,以查看视图是否需要在不需要时隐藏。这是一种积极的方法,但也是必要的,因为应用程序的许多组件都会响应不同的事件和场景。由于这一点,我有时会得到一个‘竞争条件’,用户点击了'showView‘,但同时我们的一个线程认为视图应该立即隐藏。
当两者都在主线程上发布通知时,应用程序会在SpinLock中无限期挂起。如果我能够找出上面的动画块是否被“取消”了(即在同一视图上执行的另一个动画块),我就可以完全避免这种情况。在这种情况下,我不会张贴通知,这样就不会强制检查。
长话短说:我需要能够检查动画成功结束后是否调用了'completionHandler‘,或者它是否被取消了。我知道在iOS中这是可能的,但我在OS X中找不到任何方法来做到这一点。请帮助。
发布于 2018-12-29 05:30:48
我遇到了类似的问题。我通过使用currentAnimationUUID实例变量解决了这个问题。
NSUUID *animationUUID = [[NSUUID alloc] init];
self.currentAnimationUUID = animationUUID;
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
// set properties to animate
} completionHandler:^{
BOOL isCancelled = ![self.currentAnimationUUID isEqual:animationUUID];
if (isCancelled) {
return;
}
self.currentAnimationUUID = nil;
// do stuff
}];Swift版本:
let animationUUID = UUID()
currentAnimationUUID = animationUUID
NSAnimationContext.runAnimationGroup({ context in
// set properties to animate
}, completionHandler: {
let isCancelled = self.currentAnimationUUID != animationUUID
guard !isCancelled else {
return
}
self.currentAnimationUUID = nil
// do stuff
})https://stackoverflow.com/questions/18772798
复制相似问题