IOS多线程_GCD的简单使用和详细说明

//你可以先看看这个例子的效果找点感觉,再看说明

@interface yxpGCDVController ()

{

    UIImageView *_imageView;

}

@end


@implementation yxpGCDVController


- (void)viewDidLoad

{

    [super viewDidLoad];

self.title=@"GCD";

    

    //初始化一_ImageView

    _imageView=[[UIImageView alloc] initWithFrame:CGRectMake(10, 70, 300, 450)];

    _imageView.backgroundColor=[UIColor grayColor];

    _imageView.animationDuration=3.0;

    _imageView.animationRepeatCount=0;

    [self.view addSubview:_imageView];

    

    //在后台异步执行队列

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSString *url1=@"http://h.hiphotos.baidu.com/image/w%3D230/sign=b2d5c289123853438ccf8022a311b01f/91ef76c6a7efce1b1ae9f92fad51f3deb58f6510.jpg";

        NSString *url2=@"http://h.hiphotos.baidu.com/image/pic/item/d058ccbf6c81800aae834e8bb33533fa838b47d5.jpg";

        NSString *url3=@"http://d.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494eec3ba65132ff5e0fe99257e1b.jpg";

        NSString *url4=@"http://g.hiphotos.baidu.com/image/pic/item/a6efce1b9d16fdfa81f4ace4b68f8c5494ee7b1b.jpg";

        NSString *url5=@"http://g.hiphotos.baidu.com/image/pic/item/d6ca7bcb0a46f21f70031fdbf4246b600c33ae07.jpg";

        NSArray *array=[[NSArray alloc] initWithObjects:url1,url2,url3,url4,url5, nil];

        

        NSMutableArray *imageArray=[[NSMutableArray alloc] initWithCapacity:20];

        for (NSString *string in array) {

            //下载图片

NSLog(@"执行图片下载函数");

            NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:string]];

            UIImage *image = [UIImage imageWithData:data];

            [imageArray addObject:image];

        }

        _imageView.animationImages=imageArray;

        

            //回到主线程执行方法

            dispatch_async(dispatch_get_main_queue(), ^{

                [_imageView  startAnimating];

            });

        });

}


@end


    //GCD 的使用方式

     dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

     async表明运行方式

     queue则是你把任务交给那个线程队列来处理

     block代表的是你要做的事情

    

     //线程运行方式

     dispatch_async 异步执行

     dispatch_sync  同步执行

     dispatch_delay 延迟执行

     ...

    

     //处理任务对象 dispatch queue(线程队列)

     一、dispatch_get_main_queue  主线程队列(UI线程队列)

     二、dispatch_get_global_queue 并行线程队列,由系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同。

     三、串行队列,一般用于按顺序同步访问,依次执行(顺序由代码先后觉得),可创建任意数量的串行队列,各个串行队列之间是并发的。

    

         当想要任务按照某一个特定的顺序执行时,串行队列是很有用的。串行队列在同一个时间只执行一个任务。我们可以使用串行队列代替锁去保护共享的数据。和锁不同,一个串行队列可以保证任务在一个可预知的顺序下执行。

    

         串行队列通过dispatch_queue_create创建,可以使用函数dispatch_retain和dispatch_release去增加或者减少引用计数。



    //dispatch queue叫线程队列

    dispatch_queue_create 用于创建用户线程队列。可以创建Serial/Concurrent Dispatch Queue 两种队列,即串行与并行队列。

    一、创建Serial Dispatch Queue。

    dispatch_queue_t serialQueue =dispatch_queue_create("com.SerialQueue", NULL);

    可以创建多个串行队列,串行队列也可以并行执行。决不能随意的大量生产Serial Dispatch Queue。

    

    二、创建Concurrent Dispatch Queue

    dispatch_queue_t concurrentQueue =dispatch_queue_create("com.ConcurrentQueue",

                          DISPATCH_QUEUE_CONCURRENT);

    Concurrent Dispatch Queue不过创建多少都没有问题,因为Concurrent Dispatch Queue所使用的线程由系统的XNU内核高效管理,不会影响系统性能。


// 只执行一次的线程  一般用来写单例模式

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        

    });

   EG:

static SubObject *subobject = nil;

+ (SubObject *)sharedRequest

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        subobject = [[SubObject alloc]init];

         });

    return subobject;

}


// 延迟2秒执行线程

    double delayInSeconds = 2.0;

    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

        // code to be executed on the main queue after delay

    });

   

   

//线程汇总通知,等所有子线程(这个称呼不准确,先代替了)执行完成后,才执行notify线程

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{

        // 并行执行的线程一

        for (int i=0; i<10; i++) {

            NSLog(@"---------%i",i);

        }

    });

    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{

        // 并行执行的线程二

        for (int i=10; i<20; i++) {

            NSLog(@"+++++++++%i",i);

        }

    });

    dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{

        // 汇总结果

        NSLog(@"完成");

    });


IOS多线程_GCD的简单使用和详细说明,布布扣,bubuko.com

IOS多线程_GCD的简单使用和详细说明

上一篇:android的EditText重新获取焦点问题


下一篇:【Android 初学】8、进度条(ProgressBar、SeekBar、RatingBar)