私はObjective-Cプログラミングの初心者です。初めてのアプリを作成しようとしていますが、1 つの問題を解決できません。
アプリで NSFetchedResultController で UICollectionView を使用しています。アプリは Web からデータをダウンロードし、NSOperationQueue を使用して非同期に実行します。アプリをシミュレーターでテストしているときはすべて正常に動作しますが、iPad 3 でテストしていると、このエラーが頻繁に発生します。
* -[UICollectionView _endItemAnimations]、/SourceCache/UIKit/UIKit-2380.17/UICollectionView.m:2801 でのアサーションの失敗
*キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。更新前のそのセクション (26)、そのセクションから挿入または削除された項目の数 (挿入された 1、削除された 0) のプラスまたはマイナス、およびそのセクションに移動された、またはそのセクションから移動された項目の数 (移動された 0、削除された 0) のプラスまたはマイナス引っ越した)。'
maxConcurrentOperationCount を 1 に設定したため、理由がわかりません。この場合、すべての操作でアイテムが UICollectionView に順番に挿入されると思いました...何が間違っている可能性があり、何を変更する必要がありますか?
マテウス
誰かがまだ興味を持っているなら、それは私のコードです:
NSOperation が終了したら、このメソッドを呼び出しています。
- (void)collectionViewUpdaterDidFinish:(CollectionViewUpdater *)updater {
[Artwork artworkWithBehanceInfo:self.projectsData
andImageData:updater.imageData
atIndex:updater.projectIndex
forIndexInDataBase:updater.indexPathInCollectionView.item withDataHelper:self.dataHelper];
NSIndexPath *indexPath = updater.indexPathInCollectionView;
[self.dataHelper fetchData];
[self.myCollectionView insertItemsAtIndexPaths:@[indexPath]];
[self.pendingOperations.downloadsInProgress removeObjectForKey:indexPath];
if ([self.dataHelper.fetchedResultsController.fetchedObjects count]==self.numberOfLastItemOnPage){
[self.refresh endRefreshing];
[self stopAnimation];
self.progressView.hidden = YES;
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ResultCell";
ResultCellView *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
Artwork *artwork = [self.dataHelper.fetchedResultsController objectAtIndexPath:indexPath];
cell.title.text = [artwork.title stringByAppendingString:@"\n "];
cell.owner.text = [NSString stringWithFormat:@"%@",artwork.owner];
cell.fields.text = artwork.fields;
cell.numberOfViews.text = [NSString stringWithFormat:@"%@",artwork.views];
cell.numberOfLikes.text = [NSString stringWithFormat:@"%@",artwork.likes];
cell.numberOfComments.text = [NSString stringWithFormat:@"%@",artwork.comments];
cell.publishedDate.text = artwork.publishedDate;
if ([artwork.hasThumbnail boolValue]) {
dispatch_queue_t downloadQueue = dispatch_queue_create("imagecache", NULL);
dispatch_async(downloadQueue, ^{
UIImage *productImage = [UIImage imageWithData:artwork.thumbnail];
CGSize imageSize = productImage.size;
UIGraphicsBeginImageContext(imageSize);
[productImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
productImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^ {
cell.thumbnailImage.image = productImage;
cell.thumbnailImage.hidden = NO;
});
});
}
else {
NSLog(@"Has to download thumbnail");
cell.thumbnailImage.hidden = YES;
[self startOperationsForPhotoRecord:artwork atIndexPath:indexPath];
}
if ([self.dataHelper.fetchedResultsController.fetchedObjects count]==self.numberOfLastItemOnPage) {
self.cellRefreshed = YES;
}
// it must be redifined for collections in behance!
if (indexPath.item >=(self.numberOfLastItemOnPage-10) &&self.cellRefreshed &&([self.projectsData count]%12==0)) {
self.numberOfFirstItemOnPage = self.numberOfLastItemOnPage+1;
self.numberOfLastItemOnPage +=12;
[self downloadMoreProjects];
self.cellRefreshed = NO;
}
cell.selectedBackgroundView = [[UIView alloc] initWithFrame:CGRectZero];
cell.selectedBackgroundView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5f];
return cell;
}