我在一个阵列上存储了大约100个UI
Image.我知道有一个内存使用问题最终导致应用程序崩溃,特别是在旧设备(iPhone 4s)上.在存储DocumentsDirectory上的所有UIImages的用户体验方面 – 不是一个选项(花费太长时间).所以我在考虑“合并”这两种方法.等到我收到内存使用警告,停止将图像保存到我的阵列,然后开始存储在磁盘上.我找不到正确的方法来处理内存泄漏/警告/使用调用
@H_404_6@
@H_404_6@
override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() print("memory warning") }
解决方法
尝试使用图像缓存库.
最受欢迎的比较是:
https://bpoplauschi.wordpress.com/2014/03/21/ios-image-caching-sdwebimage-vs-fastimage/
最受欢迎的比较是:
https://bpoplauschi.wordpress.com/2014/03/21/ios-image-caching-sdwebimage-vs-fastimage/
@H_404_6@
我的经验:SDWebImage最适合通常来自互联网的URL源图像,而Haneke适用于基于ID的图像,例如从视频生成的缩略图.
两者都在CocoaPods中提供.@H_404_6@
SDWebImage使用CoreData sqlite DB进行URL缓存.它没有“手工制作”图像的方法,但在从REST下载互联网图像的REST应用程序中广泛流行.我刚刚在AppStore MyHairDressers应用程序中发布它. FastCache使用文件进行URL缓存.但它也喜欢SDWebImage不适合缓存“手工制作”图像.两者都非常适合通过URL下载的图像. Haneke不仅可以通过URL按自定义ID存储图像.但是像FastCache一样需要一些配置.以下是一些配置的代码:@H_404_6@
“@H_404_6@
@H_404_6@
HNKCacheFormat *cacheFormatThumbnail = [[HNKCache sharedCache] formats][CACHE_FORMAT_THUMBNAIL]; if (cacheFormatThumbnail == nil) { cacheFormatThumbnail = [[HNKCacheFormat alloc] initWithName:CACHE_FORMAT_THUMBNAIL]; cacheFormatThumbnail.size = CGSizeMake(100.0f,56.0f); cacheFormatThumbnail.scaleMode = HNKScaleModeAspectFit; cacheFormatThumbnail.compressionQuality = 0.5f; cacheFormatThumbnail.diskCapacity = 10 * 1024 * 1024; // 10MB cacheFormatThumbnail.preloadPolicy = HNKPreloadPolicyLastSession; [[HNKCache sharedCache] registerFormat:cacheFormatThumbnail]; } HNKCacheFormat *cacheFormatPhoto = [[HNKCache sharedCache] formats][CACHE_FORMAT_PHOTO]; if (cacheFormatPhoto == nil) { cacheFormatPhoto = [[HNKCacheFormat alloc] initWithName:CACHE_FORMAT_PHOTO]; CGFloat scale = [[UIScreen mainScreen] scale]; cacheFormatPhoto.size = CGSizeMake(1280.0f * scale,720.0f * scale); cacheFormatPhoto.scaleMode = HNKScaleModeAspectFit; cacheFormatPhoto.compressionQuality = 0.5f; cacheFormatPhoto.diskCapacity = 50 * 1024 * 1024; // 50MB cacheFormatPhoto.preloadPolicy = HNKPreloadPolicyNone; [[HNKCache sharedCache] registerFormat:cacheFormatPhoto]; }
“@H_404_6@
这里是创建缓存图像的示例(TableViewCell包含带缩略图的CollectionView):@H_404_6@
“@H_404_6@
@H_404_6@
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { VideoCell *cell = (VideoCell *)[super tableView:tableView cellForRowAtIndexPath:indexPath]; VideoAsset *asset = (VideoAsset *)[self.fetchedResultsController objectAtIndexPath:indexPath]; if ([asset thumbnails] == 0) { MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:[cell thumbnails]]; hud.removeFromSuperViewOnHide = YES; [[cell thumbnails] addSubview:hud]; hud.labelText = NSLocalizedString(@"H11",nil); [hud show:YES]; CGFloat scale = [[UIScreen mainScreen] scale]; CGSize size = CGSizeMake(100.0f * scale,56.0f *scale); __weak typeof(cell) weakCell = cell; [asset generateThumbnails:self->thumbnailsCount offset:self->thumbnailsOffset size:size completion:^(NSArray *thumbnails) { dispatch_async(dispatch_get_main_queue(),^{ [hud hide:YES]; }); if ((thumbnails != nil) && ([thumbnails count] > 0)) { HNKCache *cache = [HNKCache sharedCache]; NSUInteger n = 0; NSUInteger keyHash = [[[asset assetURL] absoluteString] hash]; for (UIImage *image in thumbnails) { [cache setimage:image forKey:[Nsstring stringWithFormat:@"%lu@%i",(unsigned long)keyHash,(int)(n++)] formatName:CACHE_FORMAT_THUMBNAIL]; dispatch_async(dispatch_get_main_queue(),^{ if (weakCell != nil) { __strong typeof(cell) strongCell = weakCell; [[strongCell thumbnails] reloadData]; } }); formatName:CACHE_FORMAT_PHOTO]; } } }]; } return (UITableViewCell *)cell; }
“@H_404_6@
和使用(表视图单元格中集合的集合视图单元格):@H_404_6@
“@H_404_6@
@H_404_6@
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { ThumbnailCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; Nsstring *key = [Nsstring stringWithFormat:@"%lu@%i",(unsigned long)[[[(VideoAsset *)self->_selectedobject assetURL] absoluteString] hash],(int)[indexPath item]]; [cell setKey:key]; [cell setTag:[indexPath item]]; __weak typeof(cell) weakCell = cell; [[HNKCache sharedCache] fetchImageForKey:key formatName:CACHE_FORMAT_THUMBNAIL success:^(UIImage *image) { [[weakCell image] setimage:image]; } failure:^(NSError *error) { if ([[error domain] isEqualToString:HNKErrorDomain] && ([error code] == HNKErrorImageNotFound)) { [[weakCell image] setimage:[UIImage imageNamed:@"movieplaceholder"]]; } else [error reportError]; }]; return cell; }
“@H_404_6@
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。