문제

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];
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top