iOS GCD的简单方便

释放双眼,带上耳机,听听看~!

编辑一个场景。在iPhone上做一个下载网页的功能,就是在界面上放一个按钮,单击该按钮时,先是一个转动的圆圈,表示正在进行下载,下载完成后,将内容加载到界面上的一个文本控件中。

使用GCD之前:

someClick方法是单击按钮后的响应,使用NSInvocatinOperation创建一个后台线程,并且放到NSOperationQueue中。后台线程执行download方法。

download方法处理下载网页的逻辑。下载完成后用performSelectorOnMainThread执行download_completed方法。

download_completed进行clear up的工作,并把下载的内容显示到文本控件中。

方法如下:

static NSOperationQueue *queue;




- (void)someClick:(UIButton *)sender{

    //使用GCD方法之前

    //代码块1 开始下载


    self.indicator.hidden = NO;

    [self.indicatorstartAnimating];

    queue = [[NSOperationQueuealloc]init];

    NSInvocationOperation *operation = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(download) object:nil];

    [queue addOperation:operation];

}




//代码块2 下载中

- (void)download{

    NSURL *url = [NSURLURLWithString:@"http://www.baidu.com"];

    NSError *error;

 NSString *data = [NSStringstringWithContentsOfURL:url encoding:NSUTF8StringEncodingerror:&error];

    if (data != nil) {

   [selfperformSelectorOnMainThread:@selector(download_completed:) withObject:data waitUntilDone:NO];

    }else{

        NSLog(@"error when download:%@",error);

    }

}

//代码块3 下载完成

- (void)download_completed:(NSString *)data{

    NSLog(@"call back");

    [self.indicatorstopAnimating];

    self.indicator.hidden = YES;

    self.content.text = data;

}




使用GCD后,以上三个方法合为一起。

- (void)someClick:(UIButton *)sender{

    //原代码块1

    self.indicator.hidden = NO;

    [self.indicatorstartAnimating];




    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        //原代码块2

        NSURL *url = [NSURLURLWithString:@"http://www.baidu.com"];

        NSError *error;

        NSString *data = [NSStringstringWithContentsOfURL:url encoding:NSUTF8StringEncodingerror:&error];

        if (data != nil) {

            //原代码块3

            dispatch_async(dispatch_get_main_queue(), ^{

                [self.indicator stopAnimating];

                self.indicator.hidden = YES;

                self.content.text = data;

            });

        }else{

            NSLog(@"error when download:%@",error);

        }

    });

}

 

 

使用GCD方法可以大量减少代码量、使代码逻辑清晰可见。使用起来更加方便。

 

人已赞赏
iOS文章

iOS Runtime获取对象隐藏的属性

2020-3-2 7:52:19

iOS文章

iOS malloc和new的区别

2020-3-2 8:52:26

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索