可编辑的UITableView数据源的可能实现

时间:2016-08-04 01:03:05

标签: objective-c cocoa

我正在寻求实现一个UITableView,它包含代表媒体播放器的最近历史和未来队列的部分。在我看来,Queue类型的结构最适用于此,因为这代表了操作的性质,但是未来队列部分可编辑的要求带来了一些挑战。

我认为链接列表是存储媒体表示的最佳选择,而不是所有元素连续存储的矢量类型结构。在我看来,在移动或移除队列中的对象并在末尾添加对象的情况下,链接列表比向量更有效,因为简单地指定几个指针不同的值似乎比移动整个块更轻量级记忆NSMutableArray的内部实现细节似乎很模糊,但我假设它是一个矢量类型。

但是,我从未在Objective-C中真正看到过真正的链表实现。此外,UITableViewDataSource的结构,需要使用特定行调用cellForRowAtIndexPath:而不是简单地遍历列表,暴露了链表实现的弱点,因为寻找特定索引可能很昂贵。如果仅按顺序调用cellForRowAtIndexPath:,这将无关紧要,但忽略indexPath参数而不是仅仅遍历列表似乎是鲁莽的。

这些结构通常如何实施?是否通过链接列表迭代提出了一个坏主意?

1 个答案:

答案 0 :(得分:1)

由于Objective-C没有明确定义的“链表”对象类型,因此最接近的选择是NSMutableArray

你永远不应该假设

的顺序

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;

将被调用,如果你正确地实现UITableView,它应该只在它们出现在屏幕上之前调用单元格的索引路径(因此它被调用的顺序会根据用户的方向而改变)正在滚动。)

我建议您创建一个二维NSMutableArray,第一个表示表中的部分,第二个表示每个部分中的行。然后,您将使用以下内容初始化数组:

self.sectionsArray = [NSMutableArray array];
[self.sectionsArray addObject:[NSMutableArray array]]; // history rows
[self.sectionsArray addObject:[NSMutableArray array]]; // queued rows

这将允许您使用以下内容轻松检索存储的项目:

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    NSUInteger section = indexPath.section;
    NSUInteger row = indexPath.row;
    id fetchedObject = self.sectionsArray[section][row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellReuseID"];
    // perform setup here based on the fetchedObject
    return cell;
}

我列出了一些您可能会在下面找到帮助的NSMutableArray方法:

- (void)addObject:(ObjectType)anObject;
- (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
- (void)removeObject:(ObjectType)anObject atIndex:(NSUInteger)index;
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;
- (void)removeLastObject;