2011-12-14 52 views
0

我正在寫一個iPad應用程序,並遇到ui響應/鎖定問題。帶UITableView的RunLoop鎖起來

我有一個UITableView與項目,當一個項目被點擊時,它會在互聯網上並取出該項目並顯示它。程序的其餘部分(未顯示)將使用下載的項目,因此一次只能下載一個項目。

提取物品可能需要很長時間。在那段時間裏,我希望用戶仍然能夠滾動UITableView,但不能選擇任何東西,直到下一個點擊的項目被點擊。

我知道這可以使用線程,塊和回調來完成,但現在我沒有時間做到這一點(不可能的時間約束)。

我想到了一個快速的方法是按順序下載和使用運行循環和這樣兩個步驟的標誌:

  1. 當表格單元格didSelectRowAtIndexPath方法用戶點擊被調用,在那裏我設置一個全局標誌,然後調用下載方法來下載該項目。如果用戶點擊另一個項目(下載完成之前,它會看到國旗檢查和退出,沒有下載任何功能基本上這樣的:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
        static BOOL alreadyInHere=FALSE; 
        if (alreadyInHere) return; 
        alreadyInHere=TRUE; 
        .... 
        downloadItem(...); 
        ShowAndUseItem(...); 
        alreadyInHere=FALSE; 
    } 
    

    這允許用戶在同一時間只能選擇一個項目。

  2. 爲了讓用戶能夠在漫長的下載過程中圍繞的UITableView仍然滾動,我把在這樣上面顯示的downloadItem(...)方法的運行環...

    -(void) downloadItem(....) 
    { 
        BOOL downloading=TRUE; 
        callFunctionsToStartdownload(...); // 
        while (downloading) { 
         downloading=DownloadSomeBytes(...); 
         CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.5, YES); 
        } 
    } 
    

(1)和(2)的結果是用戶仍然可以在順序下載期間滾動UITableView,alreadyInHere標誌將阻止他們選擇某些內容並開始另一次下載。

這適用於大多數情況下,但大約50%的時間,在下載過程中,UITableView變得無響應(無法滾動到表中的其他項目),甚至在下載didSelectRowAtIndexPath後永遠不會再次調用你點擊使UITableView基本鎖定的東西。

我的問題是,我是否正確執行runLoop?

我知道還有其他方法可以做到這一點,但是現在我必須使用這種通用方法來做,因爲其他原因。

感謝

+2

這是一個可怕的方式來做到這一點。你有什麼「其他原因」? – 2011-12-14 21:10:54

+0

是的,我知道這不是最好的方法,但由於其他原因,目前無法更改....但仍有一種方法可以繼續使用此方法並解決問題嗎?謝謝 – 2011-12-15 14:02:03

回答

1

你不應該嘗試下載或在您的tableview didSelectRow方法做任何其他潛在的長期活動。設置異步下載後,從此UI方法退出(返回),以便不鎖定用戶界面。

鎖定同時下載仍然可以,但是您希望在錯誤或超時後重置狀態。