iOS 多线程安全 与 可变字典

- (void)setOperationDicValue:(id)operation forKey:(NSString *)key
{
NSCondition *mylock = [[NSCondition alloc]init];//创建锁对象
[mylock lock];//创建锁对象
[self.operationDict setObject:operation forKey:key];//对共享抢占资源进行操作的代码
[mylock unlock];//操作完数据,马上释放锁,给其他的线程调用操作
} - (void)removeOperationObjectForKey:(NSString *)key
{
NSCondition *mylock = [[NSCondition alloc]init];
[mylock lock];
[self.operationDict removeObjectForKey:key];
[mylock unlock];
} - (void)removeAllOperationObjects
{
NSCondition *mylock = [[NSCondition alloc]init];
[mylock lock];
[self.operationDict removeAllObjects];
[mylock unlock];
} - (id)getOperationObjectValueForKey:(NSString *)key
{
return [self.operationDict objectForKey:key];
}
关键怎么让线程不安全的字典变安全:(好东西要分享呀)
//
// SyncMutableDictionary.h
// banggood
//
// Created by Artillery on 2017/10/16.
// Copyright © 2017年 banggood. All rights reserved.
// #import <Foundation/Foundation.h>
/*
多线程下的安全字典 来自阿里
*/
@interface SyncMutableDictionary : NSObject - (nullable id)objectForKey:(_Nonnull id)aKey; - (nullable id)valueForKey:(_Nonnull id)aKey; - (NSArray * _Nonnull)allKeys; - (void)setObject:(nullable id)anObject forKey:(_Nonnull id <NSCopying>)aKey; - (void)removeObjectForKey:(_Nonnull id)aKey; - (void)removeAllObjects; - (NSMutableDictionary *_Nonnull)getDictionary; @end //
// SyncMutableDictionary.m
// banggood
//
// Created by Artillery on 2017/10/16.
// Copyright © 2017年 banggood. All rights reserved.
// #import "SyncMutableDictionary.h" @interface SyncMutableDictionary () @property(nonatomic, strong) NSMutableDictionary *dictionary;
@property(nonatomic, strong) dispatch_queue_t dispatchQueue; @end @implementation SyncMutableDictionary - (instancetype)init {
if (self = [super init]) {
_dictionary = [NSMutableDictionary new];
_dispatchQueue = dispatch_queue_create("com.banggood.banggoodSycmutableDictionary", DISPATCH_QUEUE_SERIAL);
}
return self;
} - (NSArray * _Nonnull)allKeys{
__block NSArray *allKeys = [NSArray array];
dispatch_sync(_dispatchQueue, ^{
allKeys = [_dictionary allKeys];
});
return allKeys;
} - (nullable id)objectForKey:(_Nonnull id)aKey{
__block id returnObject = nil;
if(!aKey) return returnObject;
dispatch_sync(_dispatchQueue, ^{
returnObject = _dictionary[aKey];
});
return returnObject;
} - (void)setValue:(nullable id)value forKey:(NSString *)key {
if(!key) return;
dispatch_barrier_async(_dispatchQueue, ^{
[_dictionary setValue:value forKey:key];
});
} - (nullable id)valueForKey:(_Nonnull id)aKey{
__block id returnObject = nil;
dispatch_sync(_dispatchQueue, ^{
returnObject = [_dictionary valueForKey:aKey];
});
return returnObject;
} - (void)setObject:(nullable id)anObject forKey:(_Nonnull id <NSCopying>)aKey{
dispatch_barrier_async(_dispatchQueue, ^{
if (anObject == nil) return;
self.dictionary[aKey] = anObject;
});
} - (void)removeObjectForKey:(_Nonnull id)aKey{
if(!aKey) return;
dispatch_sync(_dispatchQueue, ^{
[_dictionary removeObjectForKey:aKey];
});
} - (void)removeAllObjects {
dispatch_sync(_dispatchQueue, ^{
[_dictionary removeAllObjects];
});
} - (NSMutableDictionary *)getDictionary {
__block NSMutableDictionary *temp;
dispatch_sync(_dispatchQueue, ^{
temp = _dictionary;
});
return temp;
} -(NSString *)description{
return [NSString stringWithFormat:@"%@",self.dictionary];
} @end
至此总结:
可变字典,(同理可变数组等)是线程不安全的,以后尽量减少在多线程的情况下 处理数据源的情况。
如像我这次这样需要使用的话,处理成多线程安全字典和加安全锁。
iOS 多线程安全 与 可变字典的更多相关文章
- iOS 多线程安全 与可变数组
完全来自于iOS 多线程安全与可变字典 的学习 基本相同,举一反三 直接上样例代码 是我参照网上,根据当前业务需求改的. 其实好多人在这里喜欢用类别处理.我个人觉得用类别 极其容易和普通方法混淆,所以 ...
- NSDictionary字典创建,获取,遍历,可变字典的删除 - iOS
字典是以键值对的形式来存储数据 key value 1 NSDictionary 字典 1.1 创建字典,不可变的 NSDictionary * dic = [NSDictionary diction ...
- iOS多线程开发之GCD(中篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- iOS多线程编程指南
iOS多线程编程指南(拓展篇)(1) 一.Cocoa 在Cocoa上面使用多线程的指南包括以下这些: (1)不可改变的对象一般是线程安全的.一旦你创建了它们,你可以把这些对象在线程间安全的传递.另一方 ...
- iOS 多线程的使用
iOS 多线程 先看一篇阮一峰写关于进程和线程的文章,快速了解线程的相关概念. 随着现在计算机硬件的发展,多核心.高频率的cpu越来越普及,为了充分发挥cpu的性能,在不通的环境下实现cpu的利用最大 ...
- iOS 多线程 GCD part3:API
https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 ...
- iOS多线程开发之GCD(中级篇)
前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...
- iOS多线程主题
下面是:2个并发进程.和2个并发线程的示意图: 下面介绍三种多线程技术(Thread.Cocoa Operation.Grand Central Dispatch): 1.最轻量级Thread(需要自 ...
- iOS多线程技术方案
iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...
随机推荐
- easyui换主题,并记录在cookie
首先将easyui的样式文件加入一个ID,这里命名为easyuiTheme,然后在样式文件下面加入一个JS文件 <script type="text/javascript" ...
- DevelopmentValue
DevelopmentValue mysql为utf8为什么网页返回数据及写入mysql数据库均为乱码? eclipse运行配了maven之后,创建包也弹出这个错误,每次都弹 c语言怎么建立txt文件 ...
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。
在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计.SQL语句.java等层面的解决方案. 解答: 1)数据库设计方面: a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 whe ...
- 【问题】SUSE已经安装了libsodium,安装zeromq时出现下面的错误?
1.[问题]SUSE已经安装了libsodium,安装zeromq时出现下面的错误? checking for libsodium... no configure: error: Package re ...
- 蓝桥杯 C/C++参考题目 开平方(数学题,迭代法求开方)
开平方 如果没有计算器,我们如何求2的平方根?可以先猜测一个数,比如1.5,然后用2除以这个数字.如果我们猜对了,则除法的结果必然与我们猜测的数字相同.我们猜测的越准确,除法的结果与猜测的数字就越接近 ...
- 第10步:DBCA创建实例
注意,创建磁盘组时需要以oracle用户身份执行,在那之前可能需要以root身份执行xhost+,即命令: 代码1 [root@sgdb1~]# xhost+ [root@sgdb1~]# su - ...
- 进度条在.net导入Excel时的应用实例
这篇文章主要介绍了进度条在.net导入Excel时的应用,以实例形式讲述了.net导入Excel时根据页面情况显示进度条的实现方法,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了进度条在.ne ...
- Objective-C中的instancetype和id关键字(转)
转自:Objective-C中的instancetype和id关键字 一.什么是instancetype 同id一样,都是表示未知类型的的对象. 二.关联返回类型(related result typ ...
- 两天学会DirectX 3D之第二天
提要 前几天非常easy地跑了一个DirectX 9 程序,以为DirectX就那么绘制,事实证明有点Naive了. 之前的那个程序最多也就是个固定流水线的东西. 可是今天要用DirectX11来写一 ...
- boost::interprocess::managed_shared_memory(2)(std::deque)
struct shareDataEx : shareData { int index; int total_size; }; typedef managed_shared_memory::segmen ...