2013-01-31 26 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的?

我想,我將執行代碼保存到塊變量,而一些動畫正在進行。在動畫完成塊中,我看看是否有有效的執行塊。

如果有,執行,如果沒有,什麼也不做。

此外,我需要保存該塊動畫狀態被加載,當異步消息進來。

相關問題