我希望根据传入的数据动态地插入UIViews
动画。
我发送两个异步URLRequests并从另一个线程获取接收到的数据。
我正在观察一个属性,该属性动态填充来自不同请求的数据。所以KVO可能会直接向我发送消息。
使用第一个传入消息,我开始一些相关的动画。在动画时间期间经常发生新数据到达并向观察者发送消息。然后我想等到动画结束并开始播放新数据的动画。
我正在寻找一个很好的实现,而不是一个带有while循环的东西,等到bool改变。
编辑: 考虑到我不能说,首先出现哪些数据。所以我不能将动画方法定义为第一个。
答案 0 :(得分:2)
如果将进入的视图添加到mutableArray中,然后使用类似的东西,那该怎么样:
-(void) animateView:(UIView *)viewToAnimate{
[UIView animateWithDuration:0.5 animations:^{
viewToAnimate.alpha = 0;
}
completion:^(BOOL finished){
[_mutableArrayOfAnimationViews removeObject: viewToAnimate];
if ([_mutableArrayOfAnimationViews count] > 0) {
UIView *newAnimationView = [_mutableArrayOfAnimationViews objectAtIndex:0];
[self animateView: newAnimationView];
}
}];
}
然后您还可以检查视图何时进入数组是否已为空,如果是,请调用上述方法...
答案 1 :(得分:2)
如何创建一个可变数组,它是动画的kvoToDoList。在那里放置你需要的任何信息来启动动画(就像触发了kvo的对象)。
然后当观察到kvo时,将对象添加到数组并调用这样的动画函数:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
self.kvoToDoList insertObject:object atIndex:0];
// not sure here what you need to remember in order to do the animation, let's say it's just the object
[self doAnimations];
}
- (void)doAnimations {
if (self.kvoToDoList.count == 0) return;
id object = [self.kvoToDoList lastObject]; // FIFO since we insert at index 0
[self.kvoToDoList removeLastObject];
[UIView animateWithDuration:someDuration delay:0.0 options:someOptions animations:^{
// do animations here based on object
} completion:^(BOOL finished) {
// call this recursively, but performSelector so we don't wind up the stack
[self performSelector:@selector(doAnimations) withObject:nil afterDelay:0.0];
}];
}
答案 2 :(得分:0)
也许在第一个动画的完成例程中发布通知:
UIView animateWithDuration:delay:options:animations:completion:
答案 3 :(得分:0)
以一个好主意回答我自己的问题:
您如何看待executionQueue或executionBlock?
我想,我将执行代码保存到一个块变量,而一些动画正在进行中。在动画完成块中,我看,是否有一个有效的executionBlock。
如果有,执行,如果没有,则不执行任何操作。
当异步消息进入时,我还需要保存要加载的块的动画状态。