由KVO击中后执行动画(在异步URLRequest之后)

时间:2013-01-31 17:47:21

标签: ios objective-c key-value-observing uiviewanimation

我希望根据传入的数据动态地插入UIViews动画。

我发送两个异步URLRequests并从另一个线程获取接收到的数据。

我正在观察一个属性,该属性动态填充来自不同请求的数据。所以KVO可能会直接向我发送消息。

使用第一个传入消息,我开始一些相关的动画。在动画时间期间经常发生新数据到达并向观察者发送消息。然后我想等到动画结束并开始播放新数据的动画。

我正在寻找一个很好的实现,而不是一个带有while循环的东西,等到bool改变。

编辑: 考虑到我不能说,首先出现哪些数据。所以我不能将动画方法定义为第一个。

4 个答案:

答案 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。

如果有,执行,如果没有,则不执行任何操作。

当异步消息进入时,我还需要保存要加载的块的动画状态。