一千萬個為什麽

搜索

用於跟蹤UITableView行的設計模式在固定時間內與基礎數據相對應

當我的模型更改時,我想通過插入/刪除行來為UITableView中的更改設置動畫。為此,我需要知道給定行的序數(因此我可以構造NSIndexPath),我發現在比線性時間好的情況下很難做到這一點。

例如,考慮我有一個由用戶手工排序的地址簿條目列表,即沒有表示排序順序的排序“密鑰”。還有一個相應的UITableView,每個地址簿條目顯示一行。當UITableView查詢數據源時,我查詢填充了我的條目的NSMUtableArray,並在每行的固定時間內返回所需的數據。

但是,如果底層模型發生變化,我會收到通知“Joe Smith,id#123已被刪除”。現在我陷入兩難境地。一種天真的方法是掃描數組,確定Joe Smith的索引,然後讓UITableView從視圖中刪除該精確的行,同時將其從數組中刪除。但是,掃描將花費線性時間來完成。

現在我可以有一個NSDictionary,它允許我在恒定的時間內找到Joe Smith,但這對我沒有太大好處,因為我仍然需要在數組中找到他的序數索引以指示UITableView刪除該行,這又是一次線性搜索。我可以進一步決定將每個對象的序數存儲在對象本身內以使其保持不變,但是在第一次更新之後它將變得過時,因為所有後續索引值都會因刪除對象而發生變化。

那麽準確反映UITableView中的模型變化的正確(或至少是對數)時間的正確設計模式是什麽?

最佳答案

我會在您的地址字段中添加一個鍵字段,以便您可以執行二叉樹搜索。例如,假設您提供UITableView的數據模型如下所示:

NSString  *name;
NSString  *address;

您可能會想到添加一個關鍵字段,如:

NSInteger keyIndex;
NSString  *name;
NSString  *address;

如果你不想要與數據模型相關聯的密鑰(因為它是視圖控制器的抽象,並且可能只代表數組應該被排序的順序),你可以保留NSNumber的邊車NSMutableArray(或者如果在數據模型旁邊使用帶有malloc/calloc/free的自定義托管C-Array,性能非常關鍵。

然後在初始化數據源時填充keyIndex(或在重新加載消息後將數據提供給UITableView)。然後,這使得有序鍵字段的速度非常快,並且應該是O * ln(n)的順序。

當用戶刪除並修改訂單時,您需要維護Key字段。但是你這樣做,沒有某個關鍵字段,我不相信你會退出線性搜索。

轉載註明原文: 用於跟蹤UITableView行的設計模式在固定時間內與基礎數據相對應