전에 왜, reloadData
내 tableVIew, 그것은 매우 오랜 시간이 걸립니다.왜 UITableView reloadData가 애니메이션 블록에 없습니다?
내가 증명하기 위해 테스트 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-bigin 및 reloadData-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에 대한 호출로 구현 된 애니메이션 블록 내에서 행을 삽입하거나 삭제하는 메소드에서 호출하면 안됩니다.
세심한 문장으로주의
:
그것은 특히 애니메이션 블록 내에서
음, 삽입하거나 행을 삭제 방법에 호출 할 수 없습니다 ! 내가 reloadData
내 UIView
의 animateWithDuration
방법, 그래서 아래에 내 코드를 대체하지해야 의미
[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]];
}
애니메이션 블록은 애니메이션을 만드는 데 사용됩니다. 왜 거기에 다시로드할까요? 아마도 느린 이유는 셀을 다시 렌더링하는 동안 모든 것을 애니메이션으로 적용하려고하기 때문입니다. – Tj3n
@ Tj3n, 사과의 의사이지만, 나는 애니메이션 블록에'reloadData'를 넣을 수 없다는 것을 알고 있습니다. 그러나 왜, 문서는 더 설명하지 못했습니다. – aircraft
UITableViewDataSource 및 ... 대리인의 메서드를 표시하십시오. 특히 cellForRowAtIndexPath. –