2012-05-14 152 views
0

我設置了。當顯示最後一個單元格時,通過threadProcess添加單元格。當最後一個單元格顯示時添加表格單元格。在ios

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    int nArrayCount; 
    nArrayCount=[self.mAppGameList count]; 
    int row= (int)indexPath.row ; 

    if(row == nArrayCount) 
    { 
     if(mSearchGame_Thread != nil) 
      return; 

     NextSearchCell *searchCell =(NextSearchCell *)cell; 

     [searchCell.mActivityView startAnimating]; 

     NSThread *searchThread = [[NSThread alloc] initWithTarget:self 
                 selector:@selector(searchNextThreadProc:) object:tableView]; 

     self.mSearchGame_Thread = searchThread; 
     [searchThread release]; 
     [self.mSearchGame_Thread start]; 
     // start new search ... 

    } 

//線程方法

-(void)searchNextThreadProc:(id)param 
{ 

    UITableView *tableView=(id)param; 

    NSMutableArray *newArray; 

    newArray=[NSMutableArray arrayWithArray:self.mAppGameList]; 

    NSArray *pressedlist; 
    nArrayCount=[self.mAppGameList count]; 

       . 
       . 
       . 
    [newArray addObject:item]; 
    self.mAppGameList = newArray; 

    [tableView reloadData]; 

    self.mSearchGame_Thread=nil; 
} 

這樣的問題。

  1. 如果我在tableview重新載入數據時滾動表格,一段時間tableview消失並出現。

  2. 如果我在添加下一個單元格的同時觸摸單元格,有時它會發生錯誤的內存。 我想,它重新加載新表之前調用tableView:didSelectRowAtIndexPath:方法。所以,表格的數據不是。

所以,我想替換重載tableview的方式。有沒有什麼辦法?請幫幫我。

回答

2

而不是使用reloadData的,您可以通過動畫的UITableView使用此方法添加新行:

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; 

這樣重裝時,您的視圖不會dissappear和再現。通過使用UITableView add cell Animation

還要確保執行主線程UI的任何茶點:

看到這個問題

[self performSelectorOnMainThread:@selector(refreshMethodName) withObject:nil waitUntilDone:NO]; 

你的代碼的一些意見:

  • 請確保您的mAppGameList是一個保留屬性或複製屬性(如果在您的代碼中按上述方式使用)。否則可能會導致訪問不良。
  • 您應該確保searchNextThreadProc不會同時被多次調用,否則您可能會遇到計時和性能問題。它看起來不是線程安全的。
  • 通常,您應該處理的內容數據與UITableView分離一點。查看錶格視圖作爲顯示已經存在的數據列表的工具。它不應該擔心搜索數據等。而是使用一個單獨的類來保存您在NSMutableArray中使用的數據,並在需要時繼續填充數據。這個類可以觸發開始通過方法調用由tableView搜索新數據,但要確保刷新過程對於來自UI的多個調用是線程安全的和可持續的!立刻重新調用10次,意味着每次只能刷新1次! (例如,我們不希望同時調用10個服務器)此內容列表應與UITableView的列表完全分開。
  • 當新數據可用時,通過創建可調用的刷新方法來通知UITableView進行刷新。刷新UITableView時,如果mAppGameList屬性爲保留或複製,則不需要重新添加列表中的所有數據。如果你在一個包含所有數據的獨立類中有NSMutableArray,只需使用像self.mAppGameList = [NSArray arrayWithArray:[yourClass gameList]]; (如果您使用的保留爲mAppGameList)
  • 當觸發刷新UITableView時,請使用performSelectorOnMainThread。要開始一個新的後臺線程,您還可以使用performSelectorInBackground來代替NSThread alloc等。
相關問題