2014-02-12 3 views
1

최적화 및 메트릭을 위해 각 사용자가 내 UITableViewCell을 얼마나 오랫동안 보았는지 저장하는 가장 좋은 방법을 찾으려고합니다. 나는 그것을 모니터 할 수있는 도구 (Parse, AppSee 등)를 찾지 못했고, 그래서 나는 수동으로하고있다. 문제는 엄청나게 효율적이지 않다는 것입니다.화면에 UITableViewCell이 표시되는 시간을 모니터링합니다.

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView 
{ 
    UITableView *tableView = self.tableView; // Or however you get your table view 
    NSArray *paths = [tableView indexPathsForVisibleRows]; 

    // For getting the cells themselves 
    NSMutableSet *visibleCells = [[NSMutableSet alloc] init]; 

    for (NSIndexPath *path in paths) { 
     NSLog(@"visible: %i", path.row); 
     [visibleCells addObject:[tableView cellForRowAtIndexPath:path]]; 
    } 
} 

그러면 NSTimer가 표시되는 즉시 시작하고 더 이상 표시되지 않으면 중지합니다. 이 결함의 수를 가지고 다음의 tableview가 제공되면

  1. , 사용자는 스크롤하지 않고 첫 번째 셀을 볼 수 있습니다 - 따라서이 코드가 호출되지 않습니다.
  2. 이 코드는 수십억 초라고 부릅니다. 더 좋은 방법이 있어야합니다.
  3. 이 코드는 사용자가 두 번째 셀을보고 있지만 첫 번째 셀이 몇 픽셀 만 보이면 호출됩니다 . 따라서 타이머를 활성화하려면 호출이 최소한 20 % 표시되어야하는 조건이 있어야합니다.
  4. 셀을 보면서 다른 탭 표시 줄을 두드리면 이 코드는 인식하지 않고 계속 카운트합니다 ().

내 솔루션이 분명히 최적이 아닙니다. 더 좋은 방법있으세요? 솔루션을 환영합니다

+0

디스플레이를 시작하고 표시를 중지 할 시간을 저장하십시오. 이 둘의 시차는 당신이 원하는 것입니다. – Volker

+0

이론적으로는 쉽지만이 코드는 최적의 코드를 찾으려고합니다. 어떠한 제안? – anthoprotic

답변

2

테이블 뷰 대리자 메서드 및 뷰 컨트롤러 표시 메서드를 사용하십시오. 구체적으로 :

tableView:willDisplayCell:forRowAtIndexPath: 
tableView:didEndDisplayingCell:forRowAtIndexPath: 
viewDidDisappear: 
+0

답변 해 주셔서 감사합니다. 사실이 문제에 대해 생각해 보았습니다. 그러나 어떻게 각 세포의 시간을 유지 하시겠습니까? Tableview 메서드는 현재 표시중인 셀을 알면 유용하지만 뷰가 사라지면 표시되는 셀에 연결된 타이머를 중지하는 방법은 무엇입니까? – anthoprotic

+1

나는 타이머를 사용하지 않을 것이다. 지금까지 누적 된 시간과 셀이 현재 표시되어있는 경우 '시작 시간'을 포함하는 소스 데이터 ('count'의 관점에서)와 일치하는 배열을 사용합니다. 디스플레이에서 제거되면 '시작 시간'을 사용하여 누적 된 시간을 증가시킵니다. – Wain

관련 문제