完全来自于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 多线程安全 与可变数组的更多相关文章

  1. IOS 中runtime 不可变数组__NSArray0 和__NSArrayI

    IOS 中runtime 不可变数组__NSArray0 和__NSArrayI 大家可能都遇到过项目中不可变数组避免数组越界的处理:runtime,然而有时候并不能解决所有的问题,因为类簇不一样 # ...

  2. iOS 多线程安全 与 可变字典

    这周最大的收获是稍稍通透了 多线程安全字典的重要性.  诱因是,发现了有字典坏地址错误      果断以为是 value 或者 key 是可能出现了空值,补充了潜在的判断,虽然有的位置已经预判断的,但 ...

  3. iOS -Swift 3.0 -Array(数组与可变数组相关属性及用法)

    // // ViewController.swift // Swift-Array // // Created by luorende on 16/9/12. // Copyright © 2016年 ...

  4. ios可变数组的所有操作

    #pragma mark 创建数组c NSMutableArray * array =[[NSMutableArray alloc] initWithObjects:@"a",@& ...

  5. iOS多线程编程指南

    iOS多线程编程指南(拓展篇)(1) 一.Cocoa 在Cocoa上面使用多线程的指南包括以下这些: (1)不可改变的对象一般是线程安全的.一旦你创建了它们,你可以把这些对象在线程间安全的传递.另一方 ...

  6. iOS多线程的初步研究(六)

    iOS多线程的初步研究(六) iOS平台提供更高级的并发(异步)调用接口,让你可以集中精力去设计需完成的任务代码,避免去写与程序逻辑无关的线程生成.运行等管理代码.当然实质上是这些接口隐含生成线程和管 ...

  7. iOS开发-OC语言 (四)数组

    知识点 1.NSArray 2.NSMutableArray 1.数组的基本用法: 2.数组的遍历 3.数组排序 ===========   NSArray  不可变数组  ============= ...

  8. iOS多线程开发之GCD(中篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  9. iOS 多线程 GCD part3:API

    https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 ...

随机推荐

  1. 第二百一十一节,jQuery EasyUI,ValidateBox(验证框)组件

    jQuery EasyUI,ValidateBox(验证框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 4.自定义验证 本节课重点了解 EasyUI 中 ValidateBox(验证框 ...

  2. ubuntu 自动清理/tmp目录

    在Ubuntu系统中,在/tmp文件夹里面的内容,每次开机都会被清空,如果不想让他自动清理的话,只需要更改rcS文件中的TMPTIME的值. 我们看如何来修改 sudo vi /etc/default ...

  3. SurvivalShooter学习笔记(二.玩家移动旋转)

    该案例中:(PC端操作) 1.玩家移动输入控制通过虚拟轴Axis,旋转输入控制通过鼠标位置: 2.玩家始终面朝鼠标停留点,鼠标停留点通过摄像机朝地面的射线获取: 3.玩家待机移动状态切换通过Anima ...

  4. linux串口编程参数配置详解

    1.linux串口编程需要的头文件 #include <stdio.h>         //标准输入输出定义 #include <stdlib.h>        //标准函 ...

  5. 编写高质量代码--改善python程序的建议(一)

    原文发表在我的博客主页,转载请注明出处! 初衷 python是一个入门十分容易的编程语言,但是想要写好python却是一件不容易的事情,如果不是专业使用python的人,只是将python作为一个脚本 ...

  6. spring boot打包会有.war.original文件的原因 (笔记)

    今天使用spring boot 2.1.1.RELEASE版本搭建项目,虽然可以直接打包成可运行的jar包,但是由于公司准备采用docker容器来管理项目,所以需要把jar包变成war包,并且war包 ...

  7. svn 插件去除已经保存的密码方法

    删除掉C:\Documents and Settings\hao\Application Data\Subversion\auth\svn.simple文件夹下的文件即可. 再次访问时,会弹出要求输入 ...

  8. 160714、解决虚拟机上的tomcat无法被主机访问的问题

    备注:我虚拟机是centos 6.5    在wmware中安装linux后安装好数据库,JDK及tomcat后启动服务,虚拟机中可以访问,但是主机却无法访问,但是同时主机和虚拟机之间可以ping的通 ...

  9. 【IDEA】Maven踩坑:pom文件中的默认profiles不生效+IDEA中Maven的profiles使用说明

    一.问题即分析 项目pom文件中的profiles有3个配置:dev.test和production 默认配置的是dev,如下图: 但在本地起服务时,读取的配置始终是test里的. 二.原因 2.1 ...

  10. pandas删除包含指定内容的行

    Outline 处理数据时,遇到文件中包含一些不需要的数据(行),需要把这些不符合要求的行给删除掉. 例如:该数据中应该都是2000年的数据,但是包含了一些2001年的数据,所以需要把2001年的数据 ...