2016-12-29 1 views
3

전에 왜, reloadData 내 tableVIew, 그것은 매우 오랜 시간이 걸립니다.왜 UITableView reloadData가 애니메이션 블록에 없습니다?

enter image description here

내가 증명하기 위해 테스트 Log이는 느린가 표시되지 네트워크 이유는

2016-12-29 14:50:20.958 Eee[1572:25220] lml-info-vc-test-net-began 
2016-12-29 14:50:20.958 Eee[1572:25220] lml-info-vc-test-net-end 
2016-12-29 14:50:20.972 Eee[1572:25220] lml-info-vc-test-net-animations-reloadData-bigin 
2016-12-29 14:50:34.870 Eee[1572:25220] lml-info-vc-test-net-animations-reloadData-end 

우리가 보는 바와 같이, 및 그물 끝을 그물 시작 매우 소요 약간의 시간.
reloadData-biginreloadData-end은 오랜 시간이 걸리므로 검색 한 결과 reloadData은 무엇을 했습니까? 나는 깊이 대답하지 않고 단순한 대답을 알고 싶다. 나는 항상 심플한 대답만을하고 깊이있는 분석은하지 않는다.

reloadData 코드 :

//[self.pre_tableView reloadData]; 
[UIView animateWithDuration:0 animations:^{ 

    NSLog(@"lml-info-vc-test-net-animations-reloadData-bigin"); 

    [self.pre_tableView reloadData]; 
    NSLog(@"lml-info-vc-test-net-animations-reloadData-end"); 
} completion:^(BOOL finished) { 
    //Do something after that... 
    [_pre_tableView.mj_footer endRefreshing]; 
    [_pre_tableView.mj_header endRefreshing]; 

}]; 

내가 애니메이션 블록을 사용하고 completionHadler에서 상쾌한을 종료합니다.

전화 세포, 섹션 머리글과 바닥 글, 인덱스 배열을 포함하여 테이블을 구성하는 데 사용되는 모든 데이터를 다시로드하려면이 방법

는 또한 토론에 사과 docs for reloadData

를 검색 , 등등. 효율성을 위해 표보기는 표시되는 행만 다시 표시합니다. 테이블을 다시로드 한 결과 축소되면 오프셋을 조정합니다. 테이블 뷰의 대리자 또는 데이터 소스는 테이블 뷰가 데이터를 완전히 다시로드하기를 원할 때이 메서드를 호출합니다. 특히 beginUpdates와 endUpdates에 대한 호출로 구현 된 애니메이션 블록 내에서 행을 삽입하거나 삭제하는 메소드에서 호출하면 안됩니다.

세심한 문장으로주의

:

그것은 특히 애니메이션 블록 내에서

음, 삽입하거나 행을 삭제 방법에 호출 할 수 없습니다 ! 내가 reloadDataUIViewanimateWithDuration 방법, 그래서 아래에 내 코드를 대체하지해야 의미

[self.pre_tableView reloadData]; 
[_pre_tableView.mj_footer endRefreshing]; 
[_pre_tableView.mj_header endRefreshing]; 

이 지금은 더 이상 늦출 수 없습니다. 매우 행복합니다. 이유를 찾았습니다.

하지만 이유는 무엇입니까? 왜 reloadData 메서드를 애니메이션 블록에 넣을 수 없습니까?

그리고 심지어 reloadData도 실패하지 않았고, 오랜 시간이 걸립니다. 애니메이션 블록에서 무엇이 발생합니까? 그러면 여기에 너무 많은 시간이 걸립니까?


편집 -1

내 추가 코드는 다음과 같습니다 :

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    return self.pre_dataSource.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:info_TableIdentifier]; 

    if (cell == nil) { 

     cell = [[LMLAgricultureTechCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:info_TableIdentifier]; 
    } 
    //NSLog(@"lml-info-vc-test-cellSetModel-began"); 
    ((LMLAgricultureTechCell *)cell).model = self.pre_dataSource[indexPath.row]; 
    //NSLog(@"lml-info-vc-test-cellSetModel-end"); 
    ((LMLAgricultureTechCell *)cell).indexPath = indexPath; 
    ((LMLAgricultureTechCell *)cell).delegate = self; 
    ((LMLAgricultureTechCell *)cell).photo_view.delegate = self; 

    return cell; 

} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // >>>>>>>>>>>>>>>>>>>>> * cell自适应 * >>>>>>>>>>>>>>>>>>>>>>>> 
    id model; 

    model = self.pre_dataSource[indexPath.row]; 

    return [self.pre_tableView cellHeightForIndexPath:indexPath model:model keyPath:@"model" cellClass:[LMLAgricultureTechCell class] contentViewWidth:[self cellContentViewWith]]; 
} 
+0

애니메이션 블록은 애니메이션을 만드는 데 사용됩니다. 왜 거기에 다시로드할까요? 아마도 느린 이유는 셀을 다시 렌더링하는 동안 모든 것을 애니메이션으로 적용하려고하기 때문입니다. – Tj3n

+0

@ Tj3n, 사과의 의사이지만, 나는 애니메이션 블록에'reloadData'를 넣을 수 없다는 것을 알고 있습니다. 그러나 왜, 문서는 더 설명하지 못했습니다. – aircraft

+0

UITableViewDataSource 및 ... 대리인의 메서드를 표시하십시오. 특히 cellForRowAtIndexPath. –

답변

1

UIView.animateWithDuration... 방법은 animatable입니다 값에 애니메이션을 적용 할 수 있습니다. 때로는 마법 같은 느낌이 들지만 실제로는 그렇지 않습니다 ... reloadDataanimate 블록으로 처리 할 수없는 비동기 메서드입니다.

전환을 애니메이션으로 만들려면 insert/delete/moveRows을 사용하거나 transitionWithView 방법을 UIView으로 사용할 수 있습니다. 이 메서드는 뷰의 현재 상태와 새로 렌더링 된 뷰 사이의 애니메이션을 애니메이션화하는 것보다 블록에 넣은 모든 변경 사항을 살펴볼 때 뷰를 완전히 오프 스크린으로 렌더링합니다. 애니메이션 자체는 제공하는 옵션에 따라 다르며 UIViewAnimationOptionsTransitionCrossDissolve을 사용하려고합니다.

[UIView transitionWithView:self.pre_tableView 
       duration:0.3 
       options:UIViewAnimationOptionsTransitionCrossDissolve 
      animations: ^{ 
       [self.pre_tableView reloadData]; 
      } completion: ^(BOOL finished) { 
       ... 
      }]; 
+0

당신이 말한 것처럼 "reloadData는 움직이는 애니메이션 블록에서 처리 할 수없는 비동기 메서드입니다.하지만 시간이 오래 걸리더라도 다시로드됩니다.하지만 시간이 오래 걸립니다. 왜 장기? 실패한 것이 아닙니다. – aircraft

관련 문제