2010-02-14 22 views
0

我有一個應用程序需要每隔一分鐘左右更新一次顯示。爲了達到這個目的,我使用了performSelector:withObject:afterDelay,調用大部分時間只是基於非常簡單(快速)計算來改變標籤中的某些文本的選擇器。調試無響應的iPhone UI

[self performSelector:@selector(updateDisplay) withObject:nil 
    afterDelay:60]; 

偶爾在更新過程中,我必須去,並且從網上得到一些數據,所以我這樣做,在另一個線程使用detachNewThreadSelector。這一切都奏效了,「延遲之後的performSelector」調用在極短的時間內完成,並且每分鐘只運行一次。儘管如此,儘管在模擬器上運行良好,但應用程序中的單個按鈕很大程度上沒有響應,沒有響應多個刺傷。

所以,我假設peformSelector:afterDelay不會阻塞,但我現在想知道它是否以某種方式阻塞?我甚至嘗試過不做網絡查詢,這在某種程度上仍然影響了響應能力。沒有快樂。

[NSThread detachNewThreadSelector:@selector(updateFromURL) 
    toTarget:self withObject:nil]; 

我然後推它通過鯊魚,看看我能看到任何明顯。從這裏我可以看到網絡查找是唯一需要花費的時間,但它只是每隔幾分鐘完成一次,然後顯然不在主線程上運行。該應用程序本身在20分鐘內消耗了CPU的1%(0.0000034%)的一小部分,所以它只是一個阻塞問題。

所以,我缺少一些關於performSelector:afterDelay?我可能會犯什麼其他常見的新手錯誤。如果有幫助,儘管我已經開發了20多年的應用程序,但前10個主要是Java。也許我有一個Java假設加載:-)基本上我假設主線程就像EDT(只做UI的東西,但保持一切關閉它)。

回答

1

如何嘗試performSelectorInBackground來代替,並保持一個布爾信號/或請求數量的隊列?

用例必須定義:如果你在按鈕上搗爛,它是否應該執行一次或重複執行請求?

+0

沒有多重請求問題,它沒有收到第一個請求。我做了一些重要的分析,沒有任何實際價值(除非表明應該沒有問題)。我現在重新考慮了因素,並使用了一個計時器,而不是performSelector:afterDelay,它似乎有所幫助,我懷疑這裏有一些微妙的運行循環。 – rougeExciter