ios - 使用NSOperation异步加载图片时碰到的“无解”的问题
天蓬老师
天蓬老师 2017-04-17 11:49:13
[iOS讨论组]

问题描述:自定义UIImageView,在ImageView中添加了方法:

`-(void)setImageFromURL:(NSURL *)url defaultImage:(UIImage *)defaultImage queue:(NSOperationQueue *)queue;`

方法中使用自定义的ImageLoadOperation操作异步加载图片

`ImageLoadOperation *op=[[ImageLoadOperation alloc] init];
 op.url=url;
 __weak ImageLoadOperation *weakOp = op;
 op.completionBlock=^{
    if (!weakOp.isCancelled) {
        CIVImageCache *cache=weakOp.resultCache;
        self.image=[UIImage imageWithData:cache.imageData];
        NSData *cacheData=[NSData dataWithContentsOfFile:kCIVCache];
        if (cacheData==nil) {
            cacheData=[[NSData alloc] init];
        }
        NSMutableDictionary *dic=[NSKeyedUnarchiver unarchiveObjectWithData:cacheData];
        if (dic==nil) {
            dic=[[NSMutableDictionary alloc] init];
        }
        if (cache.imageData==nil) {
            cache.imageData=UIImageJPEGRepresentation([UIImage imageNamed:@"nopic.png"], 1.0);
        }
        if (![[dic allKeys] containsObject:cache.url.description]) {
            [dic setObject:cache.imageData forKey:cache.url.description];
            NSData *data=[NSKeyedArchiver archivedDataWithRootObject:dic];
            [data writeToFile:kCIVCache atomically:YES];
        }
    }
};
queue.maxConcurrentOperationCount = countOfCores();
[queue addOperation:op];`

遇到的问题是这样子加载的图片在Cell中不能立刻显示,需要等很久之后才能显示,不知道为什么。之后又加了一下代码:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
            [self stopActivityView];

            [UIView transitionWithView:self.superview
                              duration:1
                               options:UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionAllowUserInteraction
                            animations:^{
                                self.image=[UIImage imageWithData:cache.imageData];
                            } completion:nil];

        }];

使设置图片在主线程中进行,但是这样碰到的问题是在拖动的时候(主要是新的一行显示的时候)会出现明显的卡顿。这时什么坑爹的问题……求大神解答。

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
ringa_lee

基本找到了问题:是因为读写文件的缘故。我看了SDWebImge的异步加载图片,他的异步能够平滑的拖动不会有卡顿,研究了他的代码发现他使用了NSCache,读缓存的时候只有第一次内存中没有的情况下才会去读取文件,之后都是从内存中获取,我用了NSCache就没有卡顿的现象了,去掉就又有了!不过还是得找找为什么读取文件会造成卡顿。

伊谢尔伦

两种方法 1:使用tableView复用 2:在线程里面调整图片,主线程setImage

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号