美文网首页
10.7 多线程 NSOperationQueue 列队

10.7 多线程 NSOperationQueue 列队

作者: jayck | 来源:发表于2016-10-07 18:56 被阅读11次

    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
    

    相关文章

      网友评论

          本文标题:10.7 多线程 NSOperationQueue 列队

          本文链接:https://www.haomeiwen.com/subject/zgwyyttx.html