2013-06-25 61 views
0

我有一個稍微複雜的表問題,我設置了表,並給它的節數和每節的行數。實際上我沒有任何有關細胞的數據,它們現在只是空的。UITableView動態數據源

我想要做的是當用戶滾動單元格,進行API調用並獲取該單元格的數據以及接下來的50個單元格。

API調用是異步的,一旦我進行調用,我不想在用戶滾動時將其作爲下一個單元格,因爲我知道數據很快會回來。

任何想法或建議嗎?

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableView *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    // Pull data for next 50 table view cells 
    // The data will come from a server 

    return cell; 
} 
+0

只有當UITableView決定需要該行時才應調用它。嘗試一些'NSLog'來查看真正發生的事情。 – Undo

+0

您可以檢查'indexPath'來確定您是在第一行還是在最後一行。如果你在最後一行,如果不是,再次執行請求,不要這樣做。 – danypata

回答

4

這聽起來像一個偉大的機會,推出一個單獨的服務來管理您的網絡請求,而不是嵌入在你的表的數據源的中間的那個行爲。如果您的數據源要求此服務嘗試加載下一個50個單元,那麼該服務可以決定它是否應該實際啓動新的網絡請求。讓您的服務實例跟蹤哪些請求正在運行以及它們預計覆蓋哪些索引路徑範圍,以便它可以決定-shouldLoadItemsStartingAtIndexPath:樣式消息何時會導致新的網絡請求。

這是你正在尋找的模式還是你有一個關於你的方法更具體的問題?

+0

@Vikings我建議不要在'-tableView:cellForRowAtIndexPath:'內部執行網絡請求,你應該通知其他對象用戶正在查看哪個單元,並允許該對象決定對附加數據的請求因此需要。表視圖的委託可以實現'-tableView:willDisplayCell:forRowAtIndexPath:'這將是一個更好的地方,以識別單元何時變得可見並且考慮請求更多。 – Jonah

+0

我通常會這麼做@Jonah建議。總是讓最後一個單元格成爲一個特殊的單元格,當用委託方法'tableView:willDisplayCell:forRowAtIndexPath:'滾動到視圖中時,會調用下一個50個項目的加載。我通常會在其中放入一個加載微調器。 – Dennis

+0

謝謝,我採用了與此非常相似的解決方案。 – Vikings