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
iOS 多线程安全 与可变数组的更多相关文章
- IOS 中runtime 不可变数组__NSArray0 和__NSArrayI
IOS 中runtime 不可变数组__NSArray0 和__NSArrayI 大家可能都遇到过项目中不可变数组避免数组越界的处理:runtime,然而有时候并不能解决所有的问题,因为类簇不一样 # ...
- iOS 多线程安全 与 可变字典
这周最大的收获是稍稍通透了 多线程安全字典的重要性. 诱因是,发现了有字典坏地址错误 果断以为是 value 或者 key 是可能出现了空值,补充了潜在的判断,虽然有的位置已经预判断的,但 ...
- iOS -Swift 3.0 -Array(数组与可变数组相关属性及用法)
// // ViewController.swift // Swift-Array // // Created by luorende on 16/9/12. // Copyright © 2016年 ...
- ios可变数组的所有操作
#pragma mark 创建数组c NSMutableArray * array =[[NSMutableArray alloc] initWithObjects:@"a",@& ...
- iOS多线程编程指南
iOS多线程编程指南(拓展篇)(1) 一.Cocoa 在Cocoa上面使用多线程的指南包括以下这些: (1)不可改变的对象一般是线程安全的.一旦你创建了它们,你可以把这些对象在线程间安全的传递.另一方 ...
- iOS多线程的初步研究(六)
iOS多线程的初步研究(六) iOS平台提供更高级的并发(异步)调用接口,让你可以集中精力去设计需完成的任务代码,避免去写与程序逻辑无关的线程生成.运行等管理代码.当然实质上是这些接口隐含生成线程和管 ...
- iOS开发-OC语言 (四)数组
知识点 1.NSArray 2.NSMutableArray 1.数组的基本用法: 2.数组的遍历 3.数组排序 =========== NSArray 不可变数组 ============= ...
- iOS多线程开发之GCD(中篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- iOS 多线程 GCD part3:API
https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 ...
随机推荐
- .net 编码常见问题
问题一: windows service 启动时需要用死循环来控制程序,如果不开启异步,死循环会导致windows sevice 程序无法启动,代码情况如下 protected override vo ...
- CSS3自定义滚动条样式 -webkit-scrollbar (一)
Webkit支持拥有overflow属性的区域,列表框,下拉菜单,textarea的滚动条自定义样式.当然,兼容所有浏览器的滚动条样式目前是不存在的. 滚动条的组成: ::-webkit-scroll ...
- VS本地调试oracle报错解决方法
同事的项目,SVN下载下来以后一直报错,后来确认一下 1本地要安装oracle 2代码用的是64位的,所以本地安装也要64位的oracle 3VS调试用的IIS Express也要是64位的,激活方法 ...
- Ubuntu14.4下安装FTP
今天学习了Ubuntu上安装ftp的实例. 1.window上已经安装wamp(windows + apache + mysql + php) 2.window上已安装VMware Workstati ...
- 学习DBCC CHECKIDENT
检查指定表的当前标识值,如有必要,还对标识值进行更正. 语法DBCC CHECKIDENT ( 'table_name' [ , { NORESEED ...
- oracle游标:查询并打印员工的姓名和薪水
--查询并打印员工的姓名和薪水 --set serveroutput on /* 1.光标的属性 %found:假设取到了记录就是true否则是false: %notfound: */ declare ...
- python 之 内置函数大全
一.罗列全部的内置函数 戳:https://docs.python.org/2/library/functions.html 二.range.xrange(迭代器) 无论是range()还是xrang ...
- Hadoop 2.0 NameNode HA和Federation实践【转】
Hadoop 2.0 NameNode HA和Federation实践 Posted on 2012/12/10 一.背景 天云趋势在2012年下半年开始为某大型国有银行的历史交易数据备份及查询提供基 ...
- Delphi xe7 android实现透明度可以调整的对话框
Delphi xe7 android实现透明度可以调整的对话框 Delphi xe7 android实现透明度可以调整的对话框 Delphi xe7 android实现透明度可以调整的对话框 要实现对 ...
- Angular入门(三) 引入boostrap4
1.cnpm install ngx-bootstrap bootstrap --save ※可能缺少jquery cnpm i jquery 2. 打开 angular-cli.json (项目 ...