2016-08-04 5 views
0

미디어 플레이어의 최근 기록과 미래 큐를 나타내는 섹션이있는 UITableView를 구현하려고합니다. 큐 유형 구조가 작업의 특성을 나타내므로이 작업에 가장 적합 할 수 있지만 미래 큐 부분을 편집 할 수있는 요구 사항은 몇 가지 문제점을 제기합니다.가능한 편집 가능한 UITableView 데이터 소스의 구현

모든 요소가 연속적으로 저장된 벡터 형식 구조와는 달리 연결된 목록이 미디어 표현을 저장하는 데 가장 좋은 옵션이라고 생각합니다. 큐에있는 객체를 이동하거나 제거 할 때 끝에 객체를 추가하는 경우 링크 된 목록이 벡터보다 효율적입니다. 단순히 몇 개의 포인터를 할당하면 전체 청크를 이동하는 것보다 가벼운 것 같습니다. 메모리의. NSMutableArray의 내부 구현 세부 사항은 아주 희미한 것처럼 보이지만 벡터 유형이라고 가정합니다.

그러나 Objective-C에서 실제로 연결된 링크 구현을 본 적이 없습니다. 또한 UITableViewDataSource의 구조는 단순히 목록을 반복하는 것이 아니라 특정 행을 사용하여 호출해야하므로 특정 인덱스를 찾는 것이 비용이 많이 든다는 점에서 링크 된 목록 구현의 약점을 나타냅니다. cellForRowAtIndexPath:이 순서대로 호출되는 경우에는 적합하지 않지만 목록을 반복하는 데만 사용하려면 indexPath 매개 변수를 무시하는 것이 무식한 것처럼 보입니다.

이러한 구조는 일반적으로 어떻게 구현됩니까? 제안 된대로 링크 목록을 반복하는 것이 나쁜 생각입니까?

+0

"연결 목록"이란 무엇입니까? 이것은 Objective-C 나 Swift의 표준 데이터 유형이 아닙니다 ... –

+0

@WilliamLeGate [링크드 목록] (https://en.wikipedia.org/wiki/Linked_list)은 일반적인 개념으로 데이터 메모리를 통해 확산되고 포인터로 서로 연결된 노드에 저장됩니다. – Jake

답변

1

Objective-C에는 명시 적으로 정의 된 "연결 목록"개체 유형이 없으므로 가장 가까운 대안은 NSMutableArray입니다.

당신은

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

가 호출되는 순서를 가정해서는 안하고 올바르게 UITableView를 구현하는 경우, 그들 만이 화면에 표시 직전에 세포의 인덱스 경로에 대한 호출해야 (따라서 사용자가 스크롤하는 방향에 따라 순서가 변경됩니다).

1 차원이 테이블의 섹션을 나타내고 2 번째가 각 섹션의 행을 나타내는 2 차원 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; 
관련 문제