2011-12-21 51 views
0

什麼可能導致應用程序停止對接口事件正確響應?我面臨的一個問題是,我的應用停止做各種動畫,例如,鍵盤不動畫,它只出現在屏幕上。設備的旋轉不是動畫的,它只是旋轉而沒有動畫。 UIAlertView顯示和解散沒有動畫。iPad應用程序停止響應接口事件正確

我正在開發一個高性能的應用程序,每秒創建和釋放幾個對象。我儘量使用盡可能少的內存。我所描述的這個問題並不是由內存警告引起的,我沒有捕獲任何異常(我將它們全部記錄下來)。

如果任何人都可以給我任何建議,我會很感激。

Obs .:還有一件事我很好奇:在我的應用程序中,當我遇到這個問題時,uiview動畫停止發生。但CALayer動畫正常執行。有沒有解釋呢?

回答

1

聽起來好像你正在做一些阻止主線程的操作。所有用戶界面都在主線程上完成,所以如果你在那裏做了一些長時間的計算,這會導致用戶界面停止響應。你在做同步網址請求嗎?再次,這將阻止主線程。

你應該儘可能多的非UI代碼移到後臺線程儘可能......做到這一點無論是使用GCD或NSOperations

看看蘋果的​​3210。

蘋果採取的NSThreads ...

* ...從線移開可能不會在所有情況下是可能的,性能(和你的代碼的簡潔性)可以顯着的地方改善地方,你做開關。具體來說,而是使用線程的調度隊列和操作隊列有以下幾個優點:

  • 這可以減少內存懲罰你的應用程序支付用於存儲應用程序的內存空間線程堆棧。
  • 它消除了創建和配置線程所需的代碼。
  • 它消除了管理和調度線程工作所需的代碼。
  • 它簡化了您必須編寫的代碼。

另外,請參閱NSThread與NSOperationQueue上的this question

+0

好的,我會看看。我有一些在後臺運行的線程來處理數據流,我打幾個Web服務。 Web服務我執行異步和流使用NSThread。 NSOperations比NSThread有更好的性能?另一件事:如果主線程被阻止,它不應該凍結應用程序?這裏是一個視頻鏈接顯示我的問題:[鏈接] http://www.youtube.com/watch?v=eFOpPofnSnw&feature=youtu.be – Leonardo 2011-12-21 16:09:26

+0

還有一件事我很好奇:在我的應用程序中,當我有這個問題,uiview動畫停止發生。但CALayer漫反射正常發生。有沒有解釋呢? – Leonardo 2011-12-21 19:03:40

0

您可能會通過長時間運行阻塞主線程。你在代碼中的某處進行輪詢或循環?如果你這樣做(你不應該這樣做),確保你在後臺線程上執行它。

0

CALayer轉換更新可以具有比主線程更高的優先級,因此即使主UI線程被阻塞也可以看到CALayer轉換更新。但是,只要主線程被阻塞,就不會發生UI更新。 UI對象將在您阻止主線程的期間被凍結。

如果您希望UI動畫流暢,您的應用必須經常從所有主線程處理返回到UI運行循環(可能每秒至少30次?)。

+0

你如何區分ui主線程處理中的主線程處理?我從來沒有做過這樣的區分......當你說每秒至少30次時,有可能控制它? – Leonardo 2011-12-22 11:17:09

+0

在iOS應用程序中,主線程也是UI線程。任何不能快速完成的事情(幾十毫秒)都應該在另一個線程上完成,或者是異步完成。 – hotpaw2 2011-12-23 20:36:31