您好,匿名用户

使用NSOperation异步加载图片时碰到的“无解”的问题

0 投票

问题描述:自定义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];

        }];

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

用户头像 提问 2016年 9月26日 @ Miss Fortune 上士 (2,178 威望)
分享到:

1个回答

0 投票
 
最佳答案

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

用户头像 回复 2016年 9月26日 @ Jayce 中士 (1,281 威望)
提一个问题:

相关问题

+1 投票
1 回复 424 阅读
用户头像 提问 2012年 12月1日 @ Fiddlesticks 中士 (1,107 威望)
0 投票
1 回复 67 阅读
0 投票
1 回复 143 阅读
+1 投票
1 回复 146 阅读
0 投票
1 回复 34 阅读
用户头像 提问 2016年 1月12日 @ Berserker 下士 (647 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

IT技术交流群 - 随意问
欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...