iOS 多线程安全 与可变数组
完全来自于 iOS 多线程安全与可变字典 的学习
基本相同,举一反三
直接上样例代码
是我参照网上,根据当前业务需求改的。
其实好多人在这里喜欢用类别处理。我个人觉得用类别 极其容易和普通方法混淆,所以为了降低耦合度,增强代码理解性和可读性。这里单独创建类挺好的。用时候使用这个自定义的安全数组就好了。
// MensesTracker // // Created by HF on 2018/6/7. // Copyright © 2018年 huofar. All rights reserved. // #import <Foundation/Foundation.h> @interface SyncMutableArray : NSObject //只读 - (NSMutableArray *)safeArray; //判断是否包含对象 - (BOOL)containsObject:(id)anObject; //集合元素数量 - (NSUInteger)count; //获取元素 - (id)objectAtIndex:(NSUInteger)index; //枚举元素 - (NSEnumerator *)objectEnumerator; //插入 - (void)insertObject:(id)anObject atIndex:(NSUInteger)index; //插入 - (void)addObject:(id)anObject; //移除 - (void)removeObjectAtIndex:(NSUInteger)index; //移除 - (void)removeObject:(id)anObject; //移除 - (void)removeLastObject; //替换 - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject; //获取索引 - (NSUInteger)indexOfObject:(id)anObject; @end
// // SyncMutableArray.m // MensesTracker // // Created by HF on 2018/6/7. // Copyright © 2018年 huofar. All rights reserved. // #import "SyncMutableArray.h" @interface SyncMutableArray () @property (nonatomic, strong) dispatch_queue_t syncQueue; @property (nonatomic, strong) NSMutableArray* array; @end @implementation SyncMutableArray #pragma mark - init 方法 - (instancetype)initCommon { self = [super init]; if (self) { //%p 以16进制的形式输出内存地址,附加前缀0x NSString* uuid = [NSString stringWithFormat:@"com.huofar.array_%p", self]; //注意:_syncQueue是并行队列 _syncQueue = dispatch_queue_create([uuid UTF8String], DISPATCH_QUEUE_CONCURRENT); } return self; } - (instancetype)init { self = [self initCommon]; if (self) { _array = [NSMutableArray array]; } return self; } //其他init方法略 #pragma mark - 数据操作方法 (凡涉及更改数组中元素的操作,使用异步派发+栅栏块;读取数据使用 同步派发+并行队列) - (NSMutableArray *)safeArray { __block NSMutableArray *safeArray; dispatch_sync(_syncQueue, ^{ safeArray = _array; }); return safeArray; } - (BOOL)containsObject:(id)anObject { __block BOOL isExist = NO; dispatch_sync(_syncQueue, ^{ isExist = [_array containsObject:anObject]; }); return isExist; } - (NSUInteger)count { __block NSUInteger count; dispatch_sync(_syncQueue, ^{ count = _array.count; }); return count; } - (id)objectAtIndex:(NSUInteger)index { __block id obj; dispatch_sync(_syncQueue, ^{ if (index < [_array count]) { obj = _array[index]; } }); return obj; } - (NSEnumerator *)objectEnumerator { __block NSEnumerator *enu; dispatch_sync(_syncQueue, ^{ enu = [_array objectEnumerator]; }); return enu; } - (void)insertObject:(id)anObject atIndex:(NSUInteger)index { dispatch_barrier_async(_syncQueue, ^{ if (anObject && index < [_array count]) { [_array insertObject:anObject atIndex:index]; } }); } - (void)addObject:(id)anObject { dispatch_barrier_async(_syncQueue, ^{ if(anObject){ [_array addObject:anObject]; } }); } - (void)removeObjectAtIndex:(NSUInteger)index { dispatch_barrier_async(_syncQueue, ^{ if (index < [_array count]) { [_array removeObjectAtIndex:index]; } }); } - (void)removeObject:(id)anObject { dispatch_barrier_async(_syncQueue, ^{ [_array removeObject:anObject];//外边自己判断合法性 }); } - (void)removeLastObject { dispatch_barrier_async(_syncQueue, ^{ [_array removeLastObject]; }); } - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject { dispatch_barrier_async(_syncQueue, ^{ if (anObject && index < [_array count]) { [_array replaceObjectAtIndex:index withObject:anObject]; } }); } - (NSUInteger)indexOfObject:(id)anObject { __block NSUInteger index = NSNotFound; dispatch_sync(_syncQueue, ^{ for (int i = 0; i < [_array count]; i ++) { if ([_array objectAtIndex:i] == anObject) { index = i; break; } } }); return index; } - (void)dealloc { if (_syncQueue) { _syncQueue = NULL; } } @end
参考
1. https://www.aliyun.com/jiaocheng/354967.html
2.https://blog.csdn.net/zhang522802884/article/details/76728902
posted on 2018-06-07 17:08 ACM_Someone like you 阅读(3141) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
2016-06-07 iOS9 Search API 之 Spotlight
2016-06-07 iOS 9 的新功能 universal links
2014-06-07 iOS 应用有用户评论功能 因为潜在色情信息被退回解决方案