10.7 多线程 NSOperationQueue 列队

NSOperationQueue 列队

常用示例:
NSOperationQueue *queue = [NSOperationQueue new];

[queue addOperationWithBlock:^{

}
 //创建一个子线程列队,子线程为并行列队

    NSOperationQueue *queue = [NSOperationQueue new];

    [queue addOperationWithBlock:^{
        
        NSLog(@"子线程");

        //mainQueue为主线程列队,主线程为串行列队
        [[NSOperationQueue mainQueue]addOperationWithBlock:^{
            
            NSLog(@"主线程");
        }];
    }];
我们如果写一个把网络图片缓存到本地的方法,就会用到多线程
示例:
@implementation UIImageView (ImageCached)

- (void)setImageViewWithURL:(NSURL *)url{

    //缓存路径
    NSString *basePath = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp"];

    //如果路径是空的就返回
    if(url.absoluteString.length == 0){
    
        return;
    }

    //创建列队    定义文件名为url 的绝对路径
    NSOperationQueue *queue = [NSOperationQueue new];

    NSString *fileName = [self fileNameWithURL:url.absoluteString];

    //定义缓存文件路径
    NSString *cacheFilePath = [basePath stringByAppendingPathComponent:fileName];

    //如果有这个缓存文件    if([[NSFileManager defaultManager]fileExistsAtPath:cacheFilePath isDirectory:nil]){
       
        [queue addOperationWithBlock:^{

            //读取cacheFilePath看看有没有我们要的图片文件
            NSData *imageData = [NSData dataWithContentsOfFile:cacheFilePath];

            //如果有imageData的话
            if(imageData){
                
            [[NSOperationQueue mainQueue]addOperationWithBlock:^{

                    //就在主线程的image上显示
                    self.image = [UIImage imageWithData:imageData];
                }];
            }
        }];
    }else{
    
        [queue addOperationWithBlock:^{
            //从url下载图片
            NSData *data = [NSData dataWithContentsOfURL:url];
            //如果有data
            if(data){
            
                [[NSOperationQueue mainQueue]addOperationWithBlock:^{
                    //显示到image上
                    self.image = [UIImage imageWithData:data];
                    //并且存到缓存路径中
                    [data writeToFile:cacheFilePath atomically:YES];
                }];
            }
        }];
    }
}

- (NSString*)fileNameWithURL:(NSString*)urlString{

    //文件名    把url用/符号分割,取最后一个元素作为名字
    NSArray *tempArray = [urlString componentsSeparatedByString:@"/"];

    NSString *fileName = [tempArray lastObject];
    
    return fileName;
}

@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,983评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,198评论 4 61
  • 你很久没有这么开心过了,和你儿时的伙伴。我竟然会吃一群大老爷们的醋。 让我不安的,是遗憾没有参与到你的过去吧! 果...
    芥末沾寿司阅读 2,454评论 0 0
  • 喝火令·龙椅(其一) 将士埋无定,兄亲葬锦门, 独留孤寂九尊身。 枯骨砌成权位,方寸欲沉沦。 几段雕龙木,千年浸血...
    当初不该下凡阅读 461评论 3 3
  • 前两次读书觉得那两本书对于我来说太费脑壳了,所以这次选了一本简单的《从0到1》. 从0到1与从1到n的对比 第一层...
    53a04ce88de9阅读 321评论 0 0