iOS 根据视频url获取某一帧图片并实现三级缓存

本文介绍如何使用SDImageCache实现三级缓存机制,通过UIImageView的Category导入SDImageCache,并利用AVURLAsset获取指定时间点的视频帧图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该代码实现借助SDImageCache缓存机制实现三级缓存

创建一个UIImageView 的Category 导入 SDImageCache

#import <SDWebImage/SDImageCache.h>

- (void)videoImageWithvideoURL:(NSURL *)videoURL atTime:(NSTimeInterval)time {
    
    //先从缓存中找是否有图片
    SDImageCache *cache =  [SDImageCache sharedImageCache];
    UIImage *memoryImage =  [cache imageFromMemoryCacheForKey:videoURL.absoluteString];
    if (memoryImage) {
        self.image = memoryImage;
        return;
    }else{
        UIImage *diskImage =  [cache imageFromDiskCacheForKey:videoURL.absoluteString];
        if (diskImage) {
            self.image = diskImage;
            return;
        }
    }
    
    if (!time) {
        time = 1;
    }    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
        NSParameterAssert(asset);
        AVAssetImageGenerator *assetImageGenerator =[[AVAssetImageGenerator alloc] initWithAsset:asset];
        assetImageGenerator.appliesPreferredTrackTransform = YES;
        assetImageGenerator.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;
        CGImageRef thumbnailImageRef = NULL;
        CFTimeInterval thumbnailImageTime = time;
        NSError *thumbnailImageGenerationError = nil;
        thumbnailImageRef = [assetImageGenerator copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60)actualTime:NULL error:&thumbnailImageGenerationError];
        if(!thumbnailImageRef)
            NSLog(@"thumbnailImageGenerationError %@",thumbnailImageGenerationError);
        UIImage*thumbnailImage = thumbnailImageRef ? [[UIImage alloc]initWithCGImage: thumbnailImageRef] : nil;
        
        dispatch_async(dispatch_get_main_queue(), ^{
            SDImageCache *cache =  [SDImageCache sharedImageCache];
            [cache storeImage:thumbnailImage forKey:videoURL.absoluteString toDisk:YES];
            self.image = thumbnailImage;
        });
        
    });
   
}
<think>好的,我现在需要回答用户关于iOS开发中可以采取的具体性能优化措施的问题。用户之前已经询问过一般的APP性能优化措施,现在特别针对iOS开发,根据之前提到的所有优化方向,想要知道iOS开发者可以实施的具体步骤。 首先,我需要回顾之前的回答,确保覆盖所有提到的优化方向,比如启动速度、内存管理、UI渲染、网络请求、安装包体积、耗电量和架构设计等。同时,用户希望得到iOS特定的建议,所以需要将通用的优化措施转化为iOS平台的具体实现方法。 启动速度优化方面,iOS的启动过程分为pre-main和main之后两个阶段。对于pre-main阶段,需要减少动态库的数量,合或者使用静态库。同时,检查+load方法的使用,尽可能将其替换为+initialize,或者在运行时延迟加载。使用Instrument的Time Profiler来检测启动时间,找出耗时操作,将其延迟或异步执行。对于main之后的阶段,可以将非必要的初始化任务延迟到启动完成之后,或者放在后台线程执行。使用Xcode的MetricKit来监控启动时间,结合优化启动故事板或启动,减少根视控制器的初始化时间。 内存管理方面,iOS可以使用Instruments的Allocations和Leaks工具来检测内存泄漏和循环引用。避免使用强引用的闭包,使用weak或unowned来打破循环。对于图片资源,使用UIGraphicsImageRenderer代替UIGraphicsBeginImageContext,因为前者更高效。同时,加载大时使用Downsampling技术,避免内存峰值。利用NSCache和URLCache进行缓存管理,及时释放不需要的资源。在后台时,释放非必要的内存,响应AppDelegate的applicationDidEnterBackground通知,清理缓存和临时数据。 UI渲染方面,减少视层级,使用UIKit的组件如UIStackView来简化布局。避免使用透明视和离屏渲染,设置layer的shouldRasterize为YES,合理使用cornerRadius和masksToBounds。在滚动列表如UITableView或UICollectionView时,复用cell,减少动态高度计算,预计算缓存高度。使用预取API如UICollectionViewDataSourcePrefetching提前加载数据。对于复杂动画,使用Core Animation而不是频繁的UIView动画,以减少CPU负担。此外,使用Instrument的Core Animation工具检测帧率,确保保持在60fps以上。 网络请求优化方面,使用URLSession的缓存策略,合理设置NSURLRequest的cachePolicy。利用HTTP/2的多路复用减少连接时间,压缩数据使用gzip。在弱网环境下,调整超时时间,优先加载关键数据,延迟非必要请求。使用后台任务处理网络请求,如BGTaskScheduler,合理管理后台网络活动。同时,合多个请求,减少请求次数,使用Combine框架或第三方库如Alamofire的批量请求功能。 安装包体积方面,删除无用资源和代码,使用App Thinning技术,根据设备分发不同的资源。使用Asset Catalogs管理图片转换为WebP或HEIC格式以减少大小。启用Bitcode优化,进行代码剥离(Dead Code Stripping),使用Link Map分析无用类和方法。动态库尽量合,减少动态库的数量。资源文件压缩,音频文件使用适当的格式和码率。 耗电量优化方面,减少后台活动,使用低功耗的API,如使用CLLocationManager的startMonitoringSignificantLocationChanges代替持续定位。延迟非紧急任务,使用BGProcessingTask在合适的时间执行。减少屏幕亮度变化和动画,合理使用定时器,使用CADisplayLink而不是NSTimer来同步屏幕刷新。监控能耗,使用Xcode的Energy Log工具分析耗电情况,优化高耗能操作。 架构设计方面,采用模块化设计,使用Swift Package Manager或CocoaPods管理组件,减少耦合。异步编程使用GCD、OperationQueue或Swift的async/await,避免阻塞主线程。预加载数据,在空闲时提前加载可能需要的资源,使用NSPersistentContainer进行Core Data的预加载。对于启动项,使用启动服务管理器,将初始化任务按优先级和依赖关系管理,延迟非关键任务。 持续优化方面,集成Xcode的Metrics Organizer监控性能指标,使用第三方APM工具如Firebase Performance Monitoring或New Relic进行实时监控。编写单元测试和UI测试,自动化性能回归测试,确保优化不会引入新的问题。灰度发布,通过TestFlight分阶段发布,收集用户反馈和性能数据,验证优化效果。 需要确保每个措施都具体到iOS开发的工具、API或最佳实践,避免泛泛而谈。同时,可能需要提及一些常见的第三方库或框架,如使用Kingfisher进行图片加载优化,但应以苹果官方推荐的方法为主。还要注意iOS版本兼容性,例如Swift Concurrency需要iOS 13+,BGTaskScheduler需要iOS 13+等,可能需要提供替代方案。 最后,组织这些措施时,按照之前的优化方向分类,每个类别下列出具体的iOS措施,尽可能给出示例或工具的使用方法,这样用户能够清晰理解如何实施。</think>以下是针对iOS开发的具体性能优化措施,结合上述所有优化方向整理而成: --- ### **一、启动速度优化** 1. **减少pre-main时间** - **减少动态库数量**:合动态库或改用静态库(检查`Linked Frameworks and Libraries`)。 - **优化`+load`方法**:将`+load`中的逻辑迁移到`+initialize`或用`dispatch_once`延迟加载。 - **二进制重排**:通过Clang插桩(Order File)优化函数加载顺序,减少Page Fault(需Xcode 13+)。 - **工具检测**:使用Xcode的`Link Map`文件分析符号体积,或通过`Instruments`的`Time Profiler`分析启动耗时。 2. **优化main阶段** - **异步初始化**:将非必要初始化(如日志、三方SDK)放到后台线程(如`DispatchQueue.global()`)。 - **延迟加载**:使用懒加载属性(`lazy var`)推迟对象创建,避免启动时集中初始化。 - **简化首屏UI**:减少`LaunchScreen.storyboard`复杂度,避免在`application(_:didFinishLaunchingWithOptions:)`中同步加载过多视。 --- ### **二、内存管理优化** 1. **检测与修复内存泄漏** - **工具检测**:使用`Instruments`的`Leaks`和`Allocations`工具,或开启Xcode的`Memory Debugger`(Debug Navigator)。 - **循环引用处理**:对闭包使用`[weak self]`,避免强引用循环;对`delegate`使用`weak`属性。 2. **图片与资源优化** - **高效解码**:使用`UIGraphicsImageRenderer`替代`UIGraphicsBeginImageContext`,避免主线程解码大。 - **Downsampling技术**:加载大时通过`ImageIO`调整尺寸(示例代码): ```swift func downsample(imageAt url: URL, to size: CGSize) -> UIImage? { let sourceOptions = [kCGImageSourceShouldCache: false] as CFDictionary guard let source = CGImageSourceCreateWithURL(url as CFURL, sourceOptions) else { return nil } let options: [CFString: Any] = [ kCGImageSourceThumbnailMaxPixelSize: max(size.width, size.height), kCGImageSourceCreateThumbnailFromImageAlways: true, kCGImageSourceCreateThumbnailWithTransform: true ] return CGImageSourceCreateThumbnailAtIndex(source, 0, options as CFDictionary).flatMap { UIImage(cgImage: $0) } } ``` - **缓存管理**:使用`NSCache`缓存频繁访问的数据(如网络图片),监听`UIApplicationDidReceiveMemoryWarningNotification`自动清理。 3. **对象复用** - **Cell复用**:在`UITableView`/`UICollectionView`中严格复用Cell(`dequeueReusableCell`)。 - **池化技术**:对高频创建的对象(如数据库连接)实现对象池。 --- ### **三、UI渲染流畅度** 1. **减少主线程阻塞** - **异步布局**:复杂UI布局使用`DispatchQueue`异步计算,再回调主线程更新。 - **预计算布局**:对动态高度的Cell提前计算缓存高度(如`UITableView`的`estimatedRowHeight`优化)。 2. **优化列表性能** - **预加载与预取**:对`UICollectionView`使用`UICollectionViewDataSourcePrefetching`提前加载数据。 - **避免离屏渲染**:减少`layer.cornerRadius` + `masksToBounds`组合,改用`CAShapeLayer`绘制圆角。 - **异步绘制**:自定义视时,将`draw(_:)`中的复杂绘制逻辑放到后台线程,结果缓存为`UIImage`后显示。 3. **帧率监控与优化** - **检测工具**:通过`CADisplayLink`自定义帧率监控,或使用`Instruments`的`Core Animation`工具查看掉帧原因。 - **减少透明层**:设置`opaque = true`避免混合叠加计算。 --- ### **四、网络请求优化** 1. **请求合缓存** - **HTTP缓存**:利用`URLCache`设置合理的缓存策略(如`NSURLRequest.UseProtocolCachePolicy`)。 - **批量请求**:合多个接口请求(如使用`GraphQL`),减少网络往返次数。 2. **协议与数据优化** - **使用Protobuf**:替代JSON解析(需服务端配合),减少数据体积和序列化时间。 - **压缩数据**:请求头添加`Accept-Encoding: gzip`,启用服务器端压缩。 3. **弱网适配** - **超时与重试**:设置短超时(如5秒),失败后按指数退避策略重试。 - **优先级管理**:使用`URLSessionTask`的`priority`属性区分关键和非关键请求。 --- ### **五、安装包体积优化** 1. **资源精简** - **删除无用资源**:使用`Asset Catalog`管理图片,开启`On-Demand Resources`动态下载非必要资源。 - **图片压缩**:转换为WebP格式(需集成`SDWebImageWebPCoder`),或使用Xcode的`HEIC`导出选项。 2. **代码瘦身** - **死代码删除**:开启`Dead Code Stripping`(`DEAD_CODE_STRIPPING = YES`),定期通过`AppCode`检测无用代码。 - **符号剥离**:设置`Strip Linked Product = YES`,`Symbols Hidden by Default = YES`。 3. **Bitcode与编译优化** - **启用Bitcode**:允许Apple进一步优化二进制文件(需所有依赖库支持)。 - **优化编译选项**:设置`Optimization Level`为`-Os`(兼顾速度和体积)。 --- ### **六、耗电量优化** 1. **后台任务管理** - **统一调度任务**:使用`BGTaskScheduler`(iOS 13+)处理后台刷新、清理等任务,替代频繁的`Timer`。 - **限制定位精度**:非导航类场景使用`kCLLocationAccuracyHundredMeters`替代高精度定位。 2. **减少CPU/GPU负载** - **暂停非必要动画**:在应用进入后台时停止`CADisplayLink`或`CAAnimation`。 - **降低刷新频率**:对非交互性UI(如静态页)设置`preferredFramesPerSecond = 30`。 --- ### **七、架构与工程化优化** 1. **模块化与组件化** - **使用Swift Package Manager**:解耦业务模块,减少编译依赖。 - **按需加载**:通过`@_spi`或条件编译控制非核心功能初始化。 2. **预加载与懒加载** - **数据预取**:在用户空闲时预加载下一页数据(如`UICollectionView`滑动至底部前触发加载)。 - **懒加载非关键服务**:如推送、统计SDK延迟到用户首次交互后初始化。 --- ### **八、持续监控与测试** 1. **集成APM工具** - **Xcode Metrics**:查看启动时间、内存、磁盘写入等指标。 - **第三方工具**:接入Firebase Performance Monitoring或New Relic监控卡顿、ANR。 2. **自动化测试** - **编写性能测试用例**:使用XCTest的`measure`方法统计关键路径耗时。 - **CI/CD集成**:通过Fastlane脚本在每次构建后输出性能报告。 --- ### **典型案例参考** - **冷启动优化**:字节跳动通过二进制重排技术减少Page Fault,提升启动速度。 - **微信图片加载**:采用Downsampling技术避免大内存溢出。 - **淘宝列表流畅度**:UICollectionView预加载+异步解码图片。 通过结合工具链分析、代码级优化和架构设计,可系统性提升iOS应用性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值