我正在寻求实现一个UITableView,它包含代表媒体播放器的最近历史和未来队列的部分。在我看来,Queue类型的结构最适用于此,因为这代表了操作的性质,但是未来队列部分可编辑的要求带来了一些挑战。
我认为链接列表是存储媒体表示的最佳选择,而不是所有元素连续存储的矢量类型结构。在我看来,在移动或移除队列中的对象并在末尾添加对象的情况下,链接列表比向量更有效,因为简单地指定几个指针不同的值似乎比移动整个块更轻量级记忆NSMutableArray
的内部实现细节似乎很模糊,但我假设它是一个矢量类型。
但是,我从未在Objective-C中真正看到过真正的链表实现。此外,UITableViewDataSource
的结构,需要使用特定行调用cellForRowAtIndexPath:
而不是简单地遍历列表,暴露了链表实现的弱点,因为寻找特定索引可能很昂贵。如果仅按顺序调用cellForRowAtIndexPath:
,这将无关紧要,但忽略indexPath
参数而不是仅仅遍历列表似乎是鲁莽的。
这些结构通常如何实施?是否通过链接列表迭代提出了一个坏主意?
答案 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;