2011-06-01 68 views
0

這是我的問題......我正在對我正在使用的服務進行異步調用,它將搜索結果返回給我。完成後,它重新載入我的表,並完成異步。問題是,當我在異步調用完成之前嘗試在我的表視圖上滾動時,表格失去了所有滾動視圖所具有的流暢感。我的意思是,當你放開卷軸而不是繼續前進,慢慢停下來時,只要你放開,它就會停下來。恢復流體感覺的唯一方法是一直滾動到UITableView的頂部或底部並稍微過去,然後就可以了。當我在異步重載數據期間滾動時,爲什麼我的UITableView失去流動性?

這裏是我的異步調用代碼:

__block NSMutableArray *appendMoreObjects = [[NSMutableArray alloc] init]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     self.activity.hidden = NO; 

     appendMoreObjects = [service search:self.query from:((moreCount * 8)) until:((moreCount * 8) + 8)]; 

     if(appendMoreObjects == nil) 
     { 
      //alert view 
     } 
     else 
     { 
      [self.allSearchResults addObjectsFromArray:appendMoreObjects]; 

      [self updateSearchArray]; 

      self.moreCount += 1; 
     } 

     self.activity.hidden = YES; 
    }); 

而且,記住,我使用的是自定義的UITableViewCell。如果需要其他信息,請申請,我會看看我能做些什麼。先謝謝你。

EDIT1:自updateSearchArray]包含[的tableView reloadData]

EDIT2:我測試上iPod Touch的運行4.3.1(8G4)

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
customCell * cell = (customCell *)[tableView dequeueReusableCellWithIdentifier:@"cell"]; 

if(cell == nil) 
{ 
    cell = [[[customCell alloc] initWithFrame:CGRectZero] autorelease]; 
} 

if(indexPath.row == [self.searchResults count] && [self.searchResults count] > 0) 
{ 

    UITableViewCell *moreCell = [[[UITableViewCell alloc] initWithFrame:CGRectZero] autorelease]; 
    moreCell.textLabel.text = @"More"; 
    moreCell.textLabel.textAlignment = UITextAlignmentCenter; 

    return moreCell; 
} 

if(indexPath.row < [self.searchResults count]) 
{ 
    [cell formatAndInsertData:[self.searchResults objectAtIndex:indexPath.row]]; 
} 

return cell; 
} 

解決方案:

我最終做的是鎖定桌子和所有UI元素,直到完成調用。也許不是最好的解決方案,但它的效果不會那麼差。

回答

2

調用[tableView reloadData]將重新加載您的ENTIRE表,這就是您看到波濤洶涌的UITableView的原因。它強制刷新所有可見單元格,因此,在滾動時,可見單元格會刷新並重新繪製自己。您需要重新評估更新UITableView的策略,因爲您有數據進入以避免這種情況。您應該更新單個單元格,這些單元格可能包含與您的更新有關的數據。

要做到這一點,你需要使用下面的方法:

– insertRowsAtIndexPaths:withRowAnimation: 

– deleteRowsAtIndexPaths:withRowAnimation: 

– reloadRowsAtIndexPaths:withRowAnimation: 

這些的組合將讓你更新你的表(添加/刪除行),請您在收到數據,並且不強制整個表格的刷新。

+0

非常感謝!這非常有幫助。 – 2011-06-01 16:38:54

0

我想查看自定義單元格,以完全解答您的問題。

此外,您的表控制器的cellForRowAtIndexPath:段,以查看您如何重用您的單元格。

最後但並非最不重要的是:您正在測試哪種類型的設備? (類型和代)

編輯:

這一部分:

if(indexPath.row == [self.searchResults count] && [self.searchResults count] > 0) 
{ 

    UITableViewCell *moreCell = [[[UITableViewCell alloc] initWithFrame:CGRectZero] autorelease]; 
    moreCell.textLabel.text = @"More"; 
    moreCell.textLabel.textAlignment = UITextAlignmentCenter; 

    return moreCell; 
} 

看起來徹頭徹尾的毒......不要現在所擁有的,以測試它的時候,但請不要絕對儲存格中加入細胞。 .. tablecontroller將不僅困惑,但阻止了太多的內存。

只能使用cellForRowAtIndexPath:用於填充標題,描述和圖像等簡單內容。

在tableview控制器上執行重裝邏輯,但在某處更安全。 cellForRowAtIndexPath將在每次出現單元格時加載,即使它剛好在視線內。

+0

我很想向您展示自定義單元代碼,但不幸的是,我工作的公司不會允許這樣做。我可以告訴你的是,它中的所有內容都是在沒有NIB的情況下以編程方式完成的。請再次檢查我的問題以獲得最後兩個問題的答案。 – 2011-06-01 15:00:29

0

確保您只是在主線程上重新加載表數據。最好是,我使用nsinvocation而不是GCD :)

+1

除非在主線程中,否則不應訪問uikit框架中的任何內容。 – theiOSDude 2011-06-01 14:53:10

相關問題