INSTAREMSATINDEXPATHS 업데이트 오류
-
11-12-2019 - |
문제
UICollectionView에서는 performBatchUpdates:completion
를 사용하여 그리드보기에 대한 업데이트를 수행하려고합니다. 내 데이터 소스 배열은 self.results
입니다.
내 코드가 있습니다 :
.
dispatch_sync(dispatch_get_main_queue(), ^{
[self.collectionView performBatchUpdates:^{
int resultsSize = [self.results count];
[self.results addObjectsFromArray:newData];
NSMutableArray *arrayWithIndexPaths = [NSMutableArray array];
if (resultsSize == 0) {
[arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:0 inSection:0]];
}
else {
for (int i = 0; i < resultsSize; i++) {
[arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:resultsSize + i inSection:0]];
}
}
for (id obj in self.results)
[self.collectionView insertItemsAtIndexPaths:arrayWithIndexPaths];
} completion:nil];
제가 가지고있는 것에 대한 설명 / 내가하는 일 :
이 코드는 컬렉션보기에 초기 삽입이 완료되면 잘 실행됩니다. 그러나 더 많은 데이터를 내 컬렉션보기에 추가 / 삽입하면 (self.results
를 업데이트 하고이) 다음 오류가 발생합니다.
* 잡히지 않은 예외로 인한 앱을 종결하는 'NSInternalInconsistenceptionion', 이유 : '유효하지 않은 업데이트 : 유효하지 않음 섹션 0의 항목 수 0에 포함 된 항목 수 업데이트 (8)가 다음과 같은 후에 기존 섹션이 업데이트 (4), 플러스 또는 빼기 전에 해당 섹션에 포함 된 항목 해당 섹션에서 삽입되거나 삭제 된 항목 수 (32 삽입, 0 삭제됨) 및 플러스 또는 마이너스로 이동 한 항목 수 또는 해당 섹션에서 (0으로 이동, 0이 이동 됨) '
데이터 소스가 제대로 업데이트되지 않았 음을 이해합니다. 그러나
self.results
배열을 쿼리 할 때 데이터의 새 수를 봅니다.addObjectsFromArray
를 사용하여 첫 번째 줄에서 그 일을하고 있습니다.resultsSize
에 이전 결과 크기를 저장했습니다. 새로 추가 된 인덱스 경로를arrayWithIndexPaths
에 추가하려면 해당 변수를 사용합니다.이제 항목을 추가 / 삽입 할 때 다음을 루프에 시도했습니다.
for (id obj in self.results)
가 지금 사용하고있는 것입니다. 처음에는 작동하지만 추가로 충돌을 삽입합니다.
for (UIImage *image in newData)
는 초기에 작동하지만 더 이상 충돌을 삽입합니다.함수의 이름에서
insertItemsAtIndexPaths
가 루프없이 이러한 인덱스 경로에 모든 항목을 삽입 할 것으로 믿습니다. 그러나 루프가 없으면 초기에 데이터를 채우려고하면 앱이 충돌합니다.새로운
resultsSize + 1
count (새 데이터가 포함 된)와 초기 업데이트에서 충돌 할 때까지self.results
에서 루핑을 시도했습니다.내가 무엇을 잘못하고 있는지에 대한 모든 제안?
고마워,
해결책
여기에 몇 가지 사항이 틀렸어.첫째, Dispatch_sync를 사용하는지 모르겠지만 GCD에 많은 경험이 없습니다. 거기에서 일을 할 수 없었습니다. (멈추는 것처럼 보였고 UI가 응답하지 않은 것처럼 보입니다).아마도 다른 사람이 그걸 도울 수 있습니다.둘째, 인덱스 경로를 추가하는 루프에서 결과를 이해하는 것처럼 루프를 링크하는 것입니다.이를 이해하는 것은 업데이트 전의 배열의 크기입니다. 이는 원하는 것이 아닙니다. 새 인덱스를 시작하려는 작업이 아닙니다.결과를 ResultSize + NewData.Count로 올리십시오.마지막으로 insertItemSatIndExpath를 호출하면 루프가 아닌이를 한 번 수행하려고합니다.나는 이것을 시도했고, 콜렉션 뷰를 업데이트하는 데 효과가 있었다 (빈 컬렉션보기로 처음부터 시도하지 않았다) :
-(void)addNewCells {
[self.collectionView performBatchUpdates:^{
int resultsSize = [self.results count];
[self.results addObjectsFromArray:newData];
NSMutableArray *arrayWithIndexPaths = [NSMutableArray array];
for (int i = resultsSize; i < resultsSize + newData.count; i++) {
[arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]];
}
[self.collectionView insertItemsAtIndexPaths:arrayWithIndexPaths];
}
completion:nil];
}
.