2013-01-31 50 views
0

我想根据传入的数据动态插入UIViews动画。在KVO之后执行动画(在异步URL请求之后)

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

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

随着第一个传入消息,我开始一些依赖动画。在动画期间,经常会发生新的数据到达并向我的观察者发送消息。然后我想等到动画结束并开始新数据的动画。

我正在寻找一个很好的实现,而不是一个while循环,等待一个布尔变化。

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

回答

0

也许张贴通知,并在第一个动画的完成例程:

UIView animateWithDuration:delay:options:animations:completion: 
+0

不起作用,因为志愿观测方法被自动调用。嗯,我忘了提及,KVO方法被称为随机,取决于哪些数据先来。 – Fab1n

+0

这将工作;我忽略了所有需要考虑的其他问题。目前还不清楚是否要等待所有数据到达,然后执行Animation1和Animation2;或者如果您想在数据到达时立即启动每个动画。 – Dave

+0

这就是对的。我想过了,现在我明白了,你的意思。通过通知我可以控制动作完成后必须完成的操作。我在调用观察方法后执行的操作是:根据KVO方法中的新值,更改(插入/删除/更新)一个数组。我今天想到的:我观察mutableArray,并获得很好的更改通知。有了这些通知,我想每次都开始动画。 (我在模拟概念中的UITableView,并发插入/删除/更新视图 - 在scrollView) – Fab1n

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

+1同意。没有看到这个负载,因为我打字本质上是一样的想法。不过,我认为执行选择器更好,然后递归调用。 – danh

2

c怎么样? reate一个可变数组,这是您的动画kvoToDoList。把任何信息放在那里,你需要启动动画(如获得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]; 
    }]; 
} 
+0

看起来不错。我想我会尝试这个。我认为另一种选择是使用块并保存动作,以便稍后执行,当动画结束时 – Fab1n

0

要雁我自己的问题有一个不错的主意:
你怎么看一个executionQueue或executionBlock的?

我想,我将执行代码保存到块变量,而一些动画正在进行。在动画完成块中,我看看是否有有效的执行块。

如果有,执行,如果没有,什么也不做。

此外,我需要保存该块动画状态被加载,当异步消息进来。

相关问题