2014-02-23 73 views
0

我動畫的圖像,並不知道下一個圖像提前。我希望GUI通過這個保持響應。iOS動畫:不阻止GUI,同時動畫未預知的動畫

在每個動畫步驟(〜800ms)中,我嘗試通過block計算所需圖像,然後通過uiBlock更新UI。

使用GCD,在每個動畫一步我運行下面的函數block作爲我長期的任務和uiBlock包含代碼刷新GUI:

-(void)runBlock:(dispatch_block_t)block withUIblock:(dispatch_block_t)uiBlock onThread:(NSString *)thread{ 
    if ([thread isEqualToString:@"main"]) { 
     [block invoke]; 
     [uiBlock invoke]; 
    } else if ([thread isEqualToString:@"background"]){ 

     dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ 
      [block invoke]; 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       [uiBlock invoke]; 
      }); 
     }); 
    } 
} 

這個代碼塊需要這樣運行:

for (i=0; i<iterations; i++){ 
    [block invoke]; 
    [uiBlock invoke]; // because we want to see the result after each iteration 
} 

我用sync,而不是async正是因爲每個block具有先下一動畫步驟block可以運行運行;秒block需要第一個block

我在網上看到的大多數教程似乎都顯示了明顯的並行任務,例如從URL中提取數據。我想知道如何在使用dispatch_sync時讓我的UI響應(因爲這似乎是一個需求)。

回答

0

嘗試通過修改代碼TO->

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ 
      [block invoke]; //make sure that this is synchronous. 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [uiBlock invoke]; 
      }); 
     }); 

我想[block invoke]將下載的圖像,然後進行同步下載。 like [NSData dataWithUrl:url]

因此,線程的PC(程序計數器)仍然指向該塊的下載指令,直到下載完成。在下載完成之前,
dispatch_async ([uiBlock invoke])將不會執行。
下載完成後,它執行[uiBlock]

+0

我更新了我的問題;我需要這個迭代運行。您的解決方案在某種意義上起作用它以隨機順序運行「[uiBlock invoke]」。它需要在每個[block invoke]之後更新。 – Scott

+0

好的。您是否一次運行此動畫,或者您多次循環播放動畫。 – santhu

+0

而且,假設你提出了firstImage的請求,那麼你等待.8secs,現在你會請求第二張圖片嗎?如果firstImage沒有以.8secs下載,但在3secs後下載,但以2secs下載第二張圖片,您仍然會顯示第一張圖片,還是繼續從secongImage中繼續? – santhu