简单的IOS专题

GCD总结(二)

2015-10-15  本文已影响13人  laurence2100

不再使用锁(Lock)

用户队列可以用于替代锁来完成同步机制。在传统多线程编程中,你可能有一个对象要被多个线程使用,你需要一个锁来保护这个对象:

NSLock *lock;

访问代码会像这样:

- (id)something

{

id localSomething;

[lock lock];

localSomething = [[something retain] autorelease];

[lock unlock];

return localSomething;

}

- (void)setSomething:(id)newSomething

{

[lock lock];

if(newSomething != something)

{

[something release];

something = [newSomething retain];

[self updateSomethingCaches];

}

[lock unlock];

}

使用GCD,可以使用queue来替代:

dispatch_queue_t queue;

要用于同步机制,queue必须是一个用户队列,而非全局队列,所以使用usingdispatch_queue_create初始化一个。然后可以用dispatch_barrier_async和dispatch_sync将共享数据的访问代码封装起来:

- (id)something

{

__block id localSomething;

dispatch_sync(queue, ^{

localSomething = [something retain];

});

return [localSomething autorelease];

}

- (void)setSomething:(id)newSomething

{

dispatch_barrier_async(queue, ^{

if(newSomething != something)

{

[something release];

something = [newSomething retain];

[self updateSomethingCaches];

}

});

}

上一篇下一篇

猜你喜欢

热点阅读