簡體   English   中英

以編程方式鏈接的基於UIView塊的動畫在iOS上首次觸發時掛起

[英]Programmatically linked UIView block-based animations hang at the first time fired on 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時才改變或更長的時間過去了。 之后,再次調用此循環時,第二個動畫將始終正常工作。 怎么修?

首先,所有UI代碼都應在主線程上執行。 如果不遵守該規定,將會得到意想不到的結果。 當我要運行一些UI代碼時,我什么都沒經歷,而每當我錯誤地在后台線程上運行UI代碼時,應用都掛起。 有關為什么UI代碼必須在主線程上運行的討論很多。

如果您知道ReceivedResponse方法將在除主線程之外的其他線程上執行,則可以使用Grand Central Dispatch(GCD)輕松地將其帶回到主線程。 GCD比performSelectorOnMainThread方法好用得多...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM