iOS小技巧·利用宏封装线程锁的技巧

启示

第三方库中经常用到的这个小技巧,例如YYCache,SDWebImage等等,虽然各自封装的具体形式不太一样。

  • YYCache
YYCache
  • SDWebImage
SDWebImage
  • YYWebImage
YYWebImage

我们可以借鉴到自己的项目中,在适当的位置通过宏来加锁解锁操作。

使用

  • 1.YYCache版本的宏封装
#define Lock() dispatch_semaphore_wait(self->_lock, DISPATCH_TIME_FOREVER)
#define Unlock() dispatch_semaphore_signal(self->_lock)
  • 操作数据之前,先外面进行加锁解锁
- (NSInteger)totalCount {
    Lock();
    int count = [_kv getItemsCount];
    Unlock();
    return count;
}
  • 锁里面再进行真正的数据操作
- (int)getItemsCount {
    return [self _dbGetTotalItemCount];
}

2.SDWebImage版本的宏封装

  • 定义
#define LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
#define UNLOCK(lock) dispatch_semaphore_signal(lock);
  • 调用示例
- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(nullable NSString *)field {
    LOCK(self.headersLock);
    if (value) {
        self.HTTPHeaders[field] = value;
    } else {
        [self.HTTPHeaders removeObjectForKey:field];
    }
    UNLOCK(self.headersLock);
}

其中,self.headersLock 的定义为:

@property (strong, nonatomic, nonnull) dispatch_semaphore_t headersLock; 

3. YYWebImage版本的宏封装

相对于上面,还有更方便的宏封装,把解锁操作跟加锁封装在一块。

  • 宏定义
#define LOCK(...) dispatch_semaphore_wait(self->_lock, DISPATCH_TIME_FOREVER); \
__VA_ARGS__; \
dispatch_semaphore_signal(self->_lock);

#define LOCK_VIEW(...) dispatch_semaphore_wait(view->_lock, DISPATCH_TIME_FOREVER); \
__VA_ARGS__; \
dispatch_semaphore_signal(view->_lock);
  • 使用示例
- (void)didReceiveMemoryWarning:(NSNotification *)notification {
    [_requestQueue cancelAllOperations];
    [_requestQueue addOperationWithBlock: ^{
        _incrBufferCount = -60 - (int)(arc4random() % 120); // about 1~3 seconds to grow back..
        NSNumber *next = @((_curIndex + 1) % _totalFrameCount);
        LOCK(
             NSArray * keys = _buffer.allKeys;
             for (NSNumber * key in keys) {
                 if (![key isEqualToNumber:next]) { // keep the next frame for smoothly animation
                     [_buffer removeObjectForKey:key];
                 }
             }
        )//LOCK
    }];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,026评论 3 119
  • SQLite3性能调整主要通过pragma指令来实现。例如:空间释放、磁盘同步、Cache大小等。 一.空间释放1...
    周晓风阅读 6,417评论 0 1
  • 试想一下,当你和你的男(女)神去一间优雅的西餐厅,然后,你们开始点餐了,“服务员,来一份牛排。”;“好的,请问要几...
    刘若安丶阅读 1,565评论 0 0
  • 他依旧汲着鞋子路过夜场 城市慷慨亮足整夜月光 月光东流进东流的江 江边老树上系着一张女儿家的愿望 风从芭蕉撞上他的...
    文帝风尘阅读 432评论 0 1
  • 在一片澄澈的夜幕下,明月如同解开面纱的仙子,绝世容颜无遮无拦,满身光华倾世夺目。 静谧的夜在这冷月如霜下,微微凉。...
    韵书云卷阅读 325评论 0 4