程序员人生 网站导航

iOS 开发之多线程之GCD

栏目:综合技术时间:2014-12-13 08:52:03

1.GCD(Grand Centrol Dispath)

并行:宏观和微观都是两个人再拿着两把铁锹在挖坑,1小时挖两个大坑

并发:宏观上是感觉他们都在挖坑,微观是他们是在使用1把铁锹挖坑,1小时后他们挖了两个小坑。

总结:就单个cpu来讲,大部份进程是并发进行的,就是1把铁锹,你1下我1下,只是间隔时间较短,用户感觉不到而已。


利用

GCD包括:

(1)实际使用中( 而系统默许就有1个串行队列main_queue和并行队列global_queue:

[cpp] view plaincopy
  1. dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  2. dispatch_queue_t mainQ = dispatch_get_main_queue();  
)

//dispatch_get_global_queue(0, 0)第1个0是优先级,第2个保存字段
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //在这里可以是数据要求
         NSString* result = [self requestData:parameter];
        //在这里返回主线程刷新数据
        dispatch_async(dispatch_get_main_queue(), ^{
            [mainTableView reloadData];
        });
    });

举例说明:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSError * error;
    NSString * data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    if (data != nil) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"call back, the data is: %@", data);
        });
    } else {
        NSLog(@"error when download:%@", error);
    }
});


(2)也能够自己创建(我是不怎样用)

串行队列,顾名思义,1串嘛,那就得并发履行喽

//自己创建serial queue
    dispatch_queue_t queue = dispatch_queue_create("com.class15.queue", DISPATCH_QUEUE_SERIAL);
    //异步履行线程
    dispatch_async(queue, ^{
        NSLog(@"任务1:%@  %d", [NSThread currentThread],[NSThread currentThread].isMainThread);
    });



并行队列通过dispatch_get_global_queue获得,由系统创建3个不同优先级的dispatch queue

//创建自己的队列
    dispatch_queue_t queue = dispatch_queue_create("com.class15.comcrrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{
        NSLog(@"任务1:%@  %d", [NSThread currentThread],[NSThread currentThread].isMainThread);
    });

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐