GCD使用技巧

1.多用派发队列,少用同步块

1.1 编写atomic属性的访问方法

(1)使用同步块

- ( NSString *)someString {
   
@synchronized ( self ) {
       
return _someString ;
    }
}

- (
void )setSomeString:( NSString *)someString {
   
@synchronized ( self ) {
       
_someString = someString;
    }
}

    synchronized根据给定的对象,自动创建一个锁,并等待块中的代码执行完毕。执行到这段代码的结尾处,锁就释放了。在本例中,同步行为所针对的对象是self。
    滥用@synchronized(self)会很危险,因为所有同步块都会彼此抢夺同一个锁。要是有很多个属性都这么写的话,那么每个属性的同步块都要等其他所有同步块执行完毕才能执行。但我们只是想令每个属性各自独立同步。

缺点:无法实现各个属性各自独立同步

(2)使用Serial Dispatch Queue

queue = dispatch_queue_create ( "com.example.gcd.MySerialDispathQueue" , NULL );

- ( NSString *)someString {
   
__block NSString *localSomeString;
   
dispatch_sync ( queue , ^{
        localSomeString =
_someString ;
    });
   
return localSomeString;
}

- (
void )setSomeString:( NSString *)someString {
   
dispatch_async ( queue , ^{
       
_someString = someString;
    });
}
getter方法有返回值,需要以同步方式追加到派发队列。setter方法没有返回值,使用异步方式效率更高。

缺点:串行队列只有一个线程,无法实现getter方法之间的并行操作。

(3)使用dispatch_barrier_async和Concurrent Dispatch Queue

queue = dispatch_queue_create ( "com.example.gcd.MySerialDispathQueue" , DISPATCH_QUEUE_CONCURRENT );

- ( NSString *)someString {
    __block NSString *localSomeString;
   
dispatch_sync ( queue , ^{
        localSomeString =
_someString ;
    });
   
return localSomeString;
}

- (
void )setSomeString:( NSString *)someString {
   
dispatch_barrier_async ( queue , ^{
       
_someString = someString;
    });
}
在队列中,栅栏块必须单独执行,不能与其他块并行。并发队列如果发现接下来要处理的块是个栅栏块,那么久一直要等待当前所有并发块都执行完毕,才会单独执行这个栅栏块。待栅栏块执行过后,再按正常方式向下处理。

2.掌握GCD及操作队列的使用时机

GCD是纯C的API,而操作队列则是Objective-C对象。在GCD中,任务用块来表示,而块是个轻量级数据结构。与之相反,“操作”则是个更为重量级的Objective-C。但在执行后台任务时,GCD不一定是最佳方式。

使用NSOPeration及NSOperationQueue的好处:
1.取消某个操作。
运行任务之前,可以在NSOperaion对象调用cancel方法,不过已经启动的任务无法取消。若是GCD,把块加入到GCD队列之后,就无法取消了。
2.指定操作间的依赖关系
一个操作可以依赖其他多个操作。开发者能够指定操作之间的依赖关系,使特定的操作必须在另外一个操作顺利执行完毕后才可执行。
3.通过键值观测机制(KVO)来监控NSOperation对象的属性。如果想在某个任务变更其状态时得到通知,或是想用比GCD更为精细的方式来控制所要执行的任务,那么键值观测会很有用。
4.指定操作的优先级。操作的优先级表示此操作与队列中其他操作之间的优先关系。GCD的优先级是针对整个队列来说的,不是针对每个块。
5.重用NSOperation对象。系统内置了一些NSOperation的子类(比如NSBlockOperation),或之间可以创建新的子类。这些类是普通的Objective-C对象,能够存放任何信息。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值