A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 602516169 中级黑马   /  2016-9-4 07:13  /  1771 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

二、基本使用
1.问题
任务1和任务2是在主线程执行还是子线程执行,还是单独再开启一个新的线程?
复制代码 代码如下:

//
//  YYViewController.m
//  13-GCD基本使用(问题)
//
//  Created by 孔医己 on 14-6-25.
//  Copyright (c) 2014年 itcast. All rights reserved.
//
#import "YYViewController.h"
@interface YYViewController ()
@end

复制代码 代码如下:

@implementation YYViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    //开启一个后台线程,调用执行test方法
    [self performSelectorInBackground:@selector(test) withObject:nil];
}
-(void)test
{
    NSLog(@"当前线程---%@",[NSThread currentThread]);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
   
    //异步函数
    dispatch_async(queue, ^{
        NSLog(@"任务1所在的线程----%@",[NSThread currentThread]);
    });
   
    //同步函数
    dispatch_sync(queue, ^{
        NSLog(@"任务2所在的线程----%@",[NSThread currentThread]);
    });
}
@end

打印结果:
2015122893339402.png (832×62)
2.开启子线程,加载图片
复制代码 代码如下:

//
//  YYViewController.m
//  14-GCD基本使用(下载图片)
//
//  Created by 孔医己 on 14-6-25.
//  Copyright (c) 2014年 itcast. All rights reserved.
//
#import "YYViewController.h"
@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end

复制代码 代码如下:

@implementation YYViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
   
}
//当手指触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   
    //1.获取一个全局串行队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.把任务添加到队列中执行
    dispatch_async(queue, ^{
        
        //打印当前线程
        NSLog(@"%@",[NSThread currentThread]);
      //3.从网络上下载图片
        NSURL *urlstr=[NSURL URLWithString:@"http://h.hiphotos.baidu.com/baike/w%3D268/sign=30b3fb747b310a55c424d9f28f444387/1e30e924b899a9018b8d3ab11f950a7b0308f5f9.jpg"];
        NSData *data=[NSData dataWithContentsOfURL:urlstr];
        UIImage *image=[UIImage imageWithData:data];
        //提示
        NSLog(@"图片加载完毕");
        
        //4.回到主线程,展示图片
        [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
    });
}
@end

显示效果:
2015122893357380.png (348×532)
汽车修理设备出口,给您支招! 【点击进入】
汽车整套设备出口,整套设备国外建修理厂 汽车修理国外建修理厂咨询:021-59159353
查 看

打印结果:
2015122893413566.png (816×65)
要求使用GCD的方式,在子线程加载图片完毕后,主线程拿到加载的image刷新UI界面。
复制代码 代码如下:

//
//  YYViewController.m
//  14-GCD基本使用(下载图片)
//
//  Created by 孔医己 on 14-6-25.
//  Copyright (c) 2014年 itcast. All rights reserved.
//
#import "YYViewController.h"
@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end

复制代码 代码如下:

@implementation YYViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
   
}
//当手指触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   
    //1.获取一个全局串行队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.把任务添加到队列中执行
    dispatch_async(queue, ^{
        
        //打印当前线程
        NSLog(@"%@",[NSThread currentThread]);
      //3.从网络上下载图片
        NSURL *urlstr=[NSURL URLWithString:@"http://h.hiphotos.baidu.com/baike/w%3D268/sign=30b3fb747b310a55c424d9f28f444387/1e30e924b899a9018b8d3ab11f950a7b0308f5f9.jpg"];
        NSData *data=[NSData dataWithContentsOfURL:urlstr];
        UIImage *image=[UIImage imageWithData:data];
        //提示
        NSLog(@"图片加载完毕");
        
        //4.回到主线程,展示图片
//        [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
        dispatch_async(dispatch_get_main_queue(), ^{
            self.imageView.image=image;
            //打印当前线程
            NSLog(@"%@",[NSThread currentThread]);
        });
    });
}
@end

打印结果:
2015122893433477.png (805×75)
好处:子线程中得所有数据都可以直接拿到主线程中使用,更加的方便和直观。

三、线程间通信
从子线程回到主线程
复制代码 代码如下:

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执⾏耗时的异步操作...
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主线程,执⾏UI刷新操作
});
});

5 个回复

倒序浏览
队列是哪的知识点中啊
回复 使用道具 举报
66666666666666666666666
回复 使用道具 举报
6666666666666666666666666666666666666666666
回复 使用道具 举报
666666666666
回复 使用道具 举报
66666666666666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马