2016-08-04 10 views
0

メディアプレーヤーの最近の履歴と将来のキューを表すセクションを持つUITableViewを実装しようとしています。これは、操作の性質を表すため、キュータイプの構造が最も適していると思われますが、将来のキュー部分を編集可能にするという要件はいくつかの課題を提起します。編集可能なUITableViewデータソースの実装可能

すべての要素が連続して格納されるベクタータイプの構造ではなく、リンクされたリストがメディア表現を格納するのに最適なオプションになると思います。キュー内のオブジェクトを移動または削除し、最後にオブジェクトを追加する場合、リンクされたリストはベクターよりも効率的です。単純にいくつかのポインタを割り当てると、チャンク全体を移動するよりも軽量に見えるでしょうメモリの。 NSMutableArrayの内部実装の詳細は非常にわかりにくいようですが、私はそれがベクター型であると仮定しています。

しかし、Objective-Cでは本当にリンクリストの実装が実際には見られませんでした。さらに、cellForRowAtIndexPath:を単にリストを反復するのではなく、特定の行で呼び出すことを要求するUITableViewDataSourceの構造は、特定のインデックスを探すことが高価になる可能性があるため、リンクリストの実装の弱点を露呈させます。 cellForRowAtIndexPath:が順番に呼び出されるだけの場合は無関係ですが、indexPathのパラメータを無視してリストを反復するだけで無謀なようです。

これらの構造は通常どのように実装されていますか?提案されたリンクリストを反復しているのは悪い考えですか?

+0

"リンクされたリスト"とはどういう意味ですか?これはObjective-CまたはSwiftの標準データ型ではありません。 –

+0

@WilliamLeGate [リンクリスト](https://en.wikipedia.org/wiki/Linked_list)は、一般的な概念であり、データメモリを横切って広がり、ポインタによって互いに接続されたノードに格納されます。 – Jake

答えて

1

Objective-Cに明示的に定義された "リンクリスト"オブジェクトタイプがないため、最も近い代替方法はNSMutableArrayです。

あなたは

​​

が呼び出されます、そして、あなたが正しくUITableViewを実装する場合、彼らだけが画面に表示される直前のセルのインデックスパスのために呼ばれるべき順序を想定するべきではありません(したがって、呼び出される順序は、ユーザーがスクロールしている方向に基づいて変更されます)。

2次元のNSMutableArrayを作成することをお勧めします.1番目は表のセクションを表し、2番目のセクションは各セクションの行を表します。あなたは簡単の線に沿って何かを使用して格納されているアイテムを取得できるようになる

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; 
関連する問題