多线程编程

来源:互联网 发布:剑网三盾太捏脸数据 编辑:程序博客网 时间:2024/06/05 19:12
#pragma mark - 下载图像方法一:使用NSOperationQueue

- (void)downLoadImageUserOperationQueue
{
    NSString *url = kIMAGEURL;
    NSInvocationOperation *operator = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector  (downLoadImage:) object:url];                                            //申请一个新的线程
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];                    //申请一个队列
    [queue addOperation:operator];                                                 //在队列中加入线程
    

}

- (void)downLoadImage:(NSString *)urlPath
{
    NSURL  *url = [NSURL URLWithString:urlPath];
    NSData *data = [[NSData alloc]initWithContentsOfURL:url];
    
    UIImage *image = [UIImage imageWithData:data];
    [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];   //performSelectorOnMainThread: 进入主线程,再调用主线程里的方法,因为要改变界面,必须回到主线程
    
    
    
}

- (void)updateUI:(UIImage *)image       //更新图片
{
    self.myImageView.image = image;
}

#pragma mark - 下载图像方法二:使用GCD

- (void)downLoadImageUserGCD
{
    [self.myActivityView startAnimating];
    
    self.myActivityView.hidesWhenStopped = YES;
    //一步多线程编程
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{    //dispatch_get_global_queue自动生成一个全局队列,DISPATCH_QUEUE_PRIORITY_DEFAULT默认一个线程
        NSURL *url = [NSURL URLWithString:kIMAGEURL];
        NSData *data =[[NSData alloc]initWithContentsOfURL:url];
        
        UIImage * image = [UIImage imageWithData:data];
        
        if(data != nil)
        {
           dispatch_async(dispatch_get_main_queue(), ^{    //dispatch_get_main_queue() (C语言方法)获得当前主线程
               self.myImageView.image = image;
               [self.myActivityView stopAnimating];
           });
        }
        
    });

}


0 0
原创粉丝点击