iOS图片加载的消耗
2015-06-10 21:54
393 查看
一般情况下我们会对图片大小进行限制来防止数据加载缓慢,之前没有特别的感觉,最近在做一个需求的时候遇到了这方面很明显的问题。
需求是这样的:
1.一个拍照和视频录制统一在一个view的控件,要求使用view中的toolbar切换来控制是录制视频还是拍照片。
2.toolbar两种状态的切换需要用立方体动画切换;
3.在照相模式下,toolbar左下角显示相册中第一个相片。
我在第一次使用到拍照toolbar的时候获取相册照片,获取相片代码如下:
ALAssetsLibrary *assetsLibrary =[[ALAssetsLibrary alloc] init];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAllusingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if(!wakSelf.firstPhotoImage) {
[group enumerateAssetsUsingBlock:^(ALAsset*result, NSUInteger index, BOOL *stop) {
if(!wakSelf.firstPhotoImage) {
NSString *assetType = [resultvalueForProperty:ALAssetPropertyType];
if ([assetTypeisEqualToString:ALAssetTypePhoto]) {
ALAssetRepresentation *assetRepresentation=[result defaultRepresentation];
CGFloat imageScale = [assetRepresentationscale];
UIImageOrientation imageOrientation =(UIImageOrientation)[assetRepresentation orientation];
CGImageRef imageReference = [assetRepresentationfullResolutionImage];
UIImage *image =[[[UIImage alloc]initWithCGImage:imageReference scale:imageScaleorientation:imageOrientation] autorelease];
wakSelf.firstPhotoImage = image;
}
}
}];
}
} failureBlock:^(NSError *error) {
}];
但是在真机运行的时候发现第一次动画的时候没有动画过程,当照相toolbar展示过一次之后就正常显示动画了。
感觉应该是动画跟取相片有线程冲突或者其他线程问题,于是我用主动使用GCD对取照片的代码进行分装,仍然不行;还是线程冲突?我在生成这个view的时候去取照片,仍然不行。甚至到最后我在程序加载,load这个class的时候取照片,问题还在。那么就不是线程冲突的问题了。
然后我才想到照片尺寸的问题,这就很好办了,退出最初,在上面获取到照片之后,把照片压缩到一个比较小的尺寸。再次运行代码,问题解决。
回头想想,其实最早应该考虑的就是相片尺寸问题,关于线程,这个操作本来就是异步的,即使在这个操作的过程中动画开始,他也会取当时照片toolbar的状态,之后进行动画,异步的执行并不会导致动画异常。另外我做的是在生成照相toolbar的时候判断了第一张照片是否获取,如果没有我就使用了默认图片,所以也不会是线程问题。一切都是因为刚开始的思维误区,直接就奔着线程去了~~~所以以后再碰到类似问题一定要先好好分析问题再作出决定啊。
需求是这样的:
1.一个拍照和视频录制统一在一个view的控件,要求使用view中的toolbar切换来控制是录制视频还是拍照片。
2.toolbar两种状态的切换需要用立方体动画切换;
3.在照相模式下,toolbar左下角显示相册中第一个相片。
我在第一次使用到拍照toolbar的时候获取相册照片,获取相片代码如下:
ALAssetsLibrary *assetsLibrary =[[ALAssetsLibrary alloc] init];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAllusingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if(!wakSelf.firstPhotoImage) {
[group enumerateAssetsUsingBlock:^(ALAsset*result, NSUInteger index, BOOL *stop) {
if(!wakSelf.firstPhotoImage) {
NSString *assetType = [resultvalueForProperty:ALAssetPropertyType];
if ([assetTypeisEqualToString:ALAssetTypePhoto]) {
ALAssetRepresentation *assetRepresentation=[result defaultRepresentation];
CGFloat imageScale = [assetRepresentationscale];
UIImageOrientation imageOrientation =(UIImageOrientation)[assetRepresentation orientation];
CGImageRef imageReference = [assetRepresentationfullResolutionImage];
UIImage *image =[[[UIImage alloc]initWithCGImage:imageReference scale:imageScaleorientation:imageOrientation] autorelease];
wakSelf.firstPhotoImage = image;
}
}
}];
}
} failureBlock:^(NSError *error) {
}];
但是在真机运行的时候发现第一次动画的时候没有动画过程,当照相toolbar展示过一次之后就正常显示动画了。
感觉应该是动画跟取相片有线程冲突或者其他线程问题,于是我用主动使用GCD对取照片的代码进行分装,仍然不行;还是线程冲突?我在生成这个view的时候去取照片,仍然不行。甚至到最后我在程序加载,load这个class的时候取照片,问题还在。那么就不是线程冲突的问题了。
然后我才想到照片尺寸的问题,这就很好办了,退出最初,在上面获取到照片之后,把照片压缩到一个比较小的尺寸。再次运行代码,问题解决。
回头想想,其实最早应该考虑的就是相片尺寸问题,关于线程,这个操作本来就是异步的,即使在这个操作的过程中动画开始,他也会取当时照片toolbar的状态,之后进行动画,异步的执行并不会导致动画异常。另外我做的是在生成照相toolbar的时候判断了第一张照片是否获取,如果没有我就使用了默认图片,所以也不会是线程问题。一切都是因为刚开始的思维误区,直接就奔着线程去了~~~所以以后再碰到类似问题一定要先好好分析问题再作出决定啊。
相关文章推荐
- iOS的AssetsLibrary框架访问所有相片
- IOS 开发,调用打电话,发短信,打开网址
- Xcode6在iPhone5+iOS7模拟器上编译,上下有黑边问题
- error: std::ios_base::ios_base(const std::ios_base&)’是私有的
- 苹果开发工作整理
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记31 Multithreading多线程
- iOS每日一记 ——————之 友盟页面统计
- iOS 发送短信 和 发送邮件方法
- iOS发送探针日志到日志系统的简单实现
- iOS 学习资料整理
- iOS 数据的本地存储-自定义对象的归档
- iOS不同版本适配问题(#ifdef __IPHONE_7_0)
- IOS 宏定义
- iOS 数据的本地存储-对象归档
- 【iOS开发-动画】动画组CAAnimationGroup
- iOS中的字符串NSString
- 使用IOS企业版证书发布应用
- ios 如何将不支持ARC的文件设为支持ARC的--JSON
- 涨姿势!iOS零碎知识小集
- ios开发随笔之几种模式(一)