2013-09-23 46 views
0

燒在我的項目,在查詢數據庫時該程序觸發一個動畫,當它接收到響應數據時,它會自動觸發另一個動畫顯示的數據。編程鏈接的UIView基於塊的動畫掛在第一時間在iOS

-(void)queryDatabase{ 
    //...querying database ... 
    [UIView animateWithDuration:0.4 
          delay:0 
         options:UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 
         //...first animation block... 
        } 
        completion:^(BOOL finished){ 
         //...first completion block... 
        }]; 
} 

-(void)receivedResponse:(NSData *)responseData{ 
    [UIView animateWithDuration:0.4 
          delay:0 
         options:UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 
         //...second animation block... 
        } 
        completion:^(BOOL finished){ 
         //...second completion block... 
        }]; 
} 

我的問題是,該程序被啓動,並且開火收到的響應與第一次第二動畫的時候,「第二動畫塊」準確執行,但不執行「第二結束塊」和直到約20秒或更長時間過後,屏幕纔會改變。之後,再次調用此循環時,第二個動畫將始終正常工作。怎麼修?

+0

是主線程上執行接收到的響應?你可以把一個破發點上receivedResponse方法,看看它擰正在呼籲在調試導航在Xcode – bandejapaisa

+0

你寫的動畫,嵌段的東西,這是需要時間的第一次執行? Puneet的 –

+0

:動畫塊中的代碼都是關於子視圖的外觀,比如隱藏/顯示,改變幀,改變alpha。沒有耗時的代碼,第一次執行和後續執行沒有區別。它可以在模擬器上正常工作,但在iPhone 4S上有很大的延遲 –

回答

3

首先,所有的UI代碼應該執行主線程上。如果你不遵守這個規定,你會得到意想不到的結果。當我想要運行一些UI代碼時,我什麼也沒有遇到過任何事情,而當我錯誤地在後臺線程上運行UI代碼時,應用程序就會掛起。有很多討論爲什麼UI代碼必須在主線程上運行。

如果你知道你receivedResponse方法要除主線程以外的線程中執行,你可以很容易地把它帶回使用大中央調度(GCD)主線程。 GCD是要好很多,比performSelectorOnMainThread方法來使用......

-(void)receivedResponse:(NSData *)responseData{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // put your UI code in here 
    }); 
}