J'utilise PhotoKit
pour aller chercher des photos de l'album système et les mettre dans un UICollectionView
.Comment réduire l'utilisation de la mémoire avec PhotoKit?
Pour le
UICollectionViewCell
, je l'ai mis comme ceci:cell.imageView.contentMode = UIViewContentModeScaleAspectFill;
Quand paraphant mon
UICollectionView
, je vais chercher la photoPHAsset
decollection
:Camera Roll
seulement:PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; [fetchResult enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop) { NSLog(@"ALBUM NAME: %@", collection.localizedTitle); if ([collection.localizedTitle isEqualToString:@"Camera Roll"]) { _fetchedPhotos = [PHAsset fetchAssetsInAssetCollection:collection options:nil]; _pickedStatuses = @[].mutableCopy; NSMutableArray *assets = @[].mutableCopy; _manager = [[PHCachingImageManager alloc] init]; _options = [[PHImageRequestOptions alloc] init]; _options.resizeMode = PHImageRequestOptionsResizeModeExact; _options.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic; CGFloat scale = [UIScreen mainScreen].scale; CGSize targetSize = CGSizeMake(layout.itemSize.width*scale, layout.itemSize.height*scale); //I'm not sure if this api should be called here [_manager startCachingImagesForAssets:assets targetSize:targetSize contentMode:PHImageContentModeAspectFill options:_options]; } }];
Ensuite, Je demande le
UIImage
dePHFetchResult
d'en haut comme th est:-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { MYCell *cell = (MYCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"reuseCell" forIndexPath:indexPath]; CGFloat scale = [UIScreen mainScreen].scale; CGSize targetSize = CGSizeMake(_layout.itemSize.width*scale, _layout.itemSize.height*scale); PHAsset *asset = _fetchedPhotos[indexPath.item]; [_manager requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeAspectFill options:_options resultHandler:^(UIImage *result, NSDictionary *info) { cell.imageView.image = result; }]; return cell; }
Mais quand je le lance et faites défiler la UICollectionView
assez vite, je trouve l'utilisation de la mémoire devient raide comme ceci:
Comment puis-je réduire en cas il planterait lorsque la mémoire ne suffit pas?
Je m'attendrais à ce genre de motif, car avant que PhotoKit puisse créer la vignette, il doit charger toute l'image en mémoire. Aussi, testez-vous sur des appareils ou dans le simulateur? Le comportement de la mémoire sera très différent entre les deux, donc testez toujours sur l'appareil pour obtenir une image réaliste des performances de vos applications. –
Je suis toujours tester sur l'appareil qui est mon iPhone 6 Plus. – Boris