2018-02-01

代码块和并发性

标签: OC学习


1.代码块

传统的函数指针:void (*my_func)(void);
代码块的定义:将*换成^

1.1 举例:

int (^square_block)(int number) = 
    ^(int num){return num*num;};

int result = square_block(6);
printf("Result = %d\n", result);

实现方式:

 (^blockname)(list of arguments) = ^(arguments){ body; };

返回类型,参数表都是可以省略的部分,如下例一个极简代码块:

void (^theBlock)() = ^{ printf("Hello World\n"); };

1.2 代码块的使用

  • 同一般函数直接通过函数名调用;
  • 直接将代码块当做参数;

2.并发性

核心方法:GCD

2.1 NSObject提供的方法

performSelectorInBackground:withObject:能够创建一个线程在后台运行方法;
限制:

  • 必须创建自动释放池
  • 方法不能有返回值,至多有一个参数

示例:

//方法函数定义
-(void) myBackgroundMethod:(id)myObject
{
    @autoreleasepool
    {   
        NSLog(@"My background method %@",myObject);
    }
}

//方法调用
[self performSelectorInBackground:@selector(myBackgroundMethod) withObject:argumentObject];

2.2 调度队列

使用方法: 实现方法代码,然后为其指派一个队列

  • 连续队列
  • 并发队列
  • 主队列

1)连续队列:一连串任务按照一定顺序执行,先入先出;

//第一个参数为队列名称,第二个参数为队列特性
dispatch_queue-t myQueue;
myQueue = dispatch_queue_create("queueName",NULL);

2)并发队列:系统提供3种:高优先级默认优先级低优先级

dispatch_queue-t myQueue;
myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);

3)主队列:使用dispatch_get_main_queue可以访问与应用程序主线程有关的连续队列;

dispatch_queue-t myQueue;
myQueue = dispatch_get_current_queue(void);

你可能感兴趣的:(2018-02-01)