iOS 多线程安全的数组MultiThreadSafeObject
2017-12-19 14:00
375 查看
iOS只提供了非线程安全的数组。
如果要多线程并发的使用一个数组对象就必须要加锁,频繁加锁使代码的调用非常的麻烦。
我们需要多线程的读写锁在类的内部实现,所以需要对NSMutableArray进行封装,封装后的对象负责接受所有事件并将其转发给真正的NSMutableArray对象,并通过合理的调度使得其支持多线程并发。
新建一个对象来对NSMutableArray 数组进行封装,包含
dispatch_queue_t 调度队列对象 和一个
NSObject 具体操作对象作为成员变量
我们再新建mtsMutableArray类继承自MultiThreadSafeObject并为其声明简单接口来支持其作为Array使用
获取调度方法的返回值,如果是void型方法则使用异步调度,如果是getter类型的则使用同步调度,可以略微的提升性能。
可以通过继承等方法为不同类型的container指定不同的调度规则以确保在逻辑正常的情况下拥有最高的性能。
代码
如果要多线程并发的使用一个数组对象就必须要加锁,频繁加锁使代码的调用非常的麻烦。
我们需要多线程的读写锁在类的内部实现,所以需要对NSMutableArray进行封装,封装后的对象负责接受所有事件并将其转发给真正的NSMutableArray对象,并通过合理的调度使得其支持多线程并发。
新建一个对象来对NSMutableArray 数组进行封装,包含
dispatch_queue_t 调度队列对象 和一个
NSObject 具体操作对象作为成员变量
@implementation MultiThreadSafeObject - (id)init { self = [super init]; if (self) { _mtsDispatchQueue = dispatch_queue_create("COM.MTS.MultiThreadSafeObject", NULL); } return self; } - (void)dealloc { _mtsDispatchQueue = nil; _mtsContainer = nil; }
我们再新建mtsMutableArray类继承自MultiThreadSafeObject并为其声明简单接口来支持其作为Array使用
#import "MultiThreadSafeObject.h" @protocol mtsMutableArrayProtocol @optional - (id)lastObject; - (id)objectAtIndex:(NSUInteger)index; - (NSUInteger)count; - (void)addObject:(id)anObject; - (void)insertObject:(id)anObject atIndex:(NSUInteger)index; - (void)removeLastObject; - (void)removeObjectAtIndex:(NSUInteger)index; - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject; @end @interface mtsMutableArray : MultiThreadSafeObject<mtsMutableArrayProtocol> @end
使用消息转发
#pragma mark - public method - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { return [[_mtsContainer class] instanceMethodSignatureForSelector:aSelector]; } - (void)forwardInvocation:(NSInvocation *)anInvocation { NSMethodSignature *sig = [anInvocation valueForKey:@"_signature"]; const char *returnType = sig.methodReturnType; //NSLog(@"%@ = > %@",anInvocation.target, NSStringFromSelector(anInvocation.selector)); //NSLog(@"%s",returnType); if (!strcmp(returnType, "v")) { //没有返回值 setter方法 异步barrier /** the setter method just use async dispatch remove the barrier to make it faster when u r sure that invacations will not affect each other */ dispatch_barrier_async(_mtsDispatchQueue, ^{ [anInvocation invokeWithTarget:_mtsContainer]; }); } else { //有返回值 getter方法 同步barrier /** all getter method need sync dispatch barrier make sure the result is correct getter method need barrier in most ways unless u dont except this */ dispatch_barrier_sync(_mtsDispatchQueue, ^{ [anInvocation invokeWithTarget:_mtsContainer]; }); } }
获取调度方法的返回值,如果是void型方法则使用异步调度,如果是getter类型的则使用同步调度,可以略微的提升性能。
可以通过继承等方法为不同类型的container指定不同的调度规则以确保在逻辑正常的情况下拥有最高的性能。
代码
相关文章推荐
- iOS 多线程安全数组
- iOS多线程之线程安全和GCD
- ios笔记-- 多线程应该知道的那几件事 GCD NSThread NSOperation
- iOS多线程编程之NSThread的使用
- iOS多线程编程之NSThread的使用
- Thread_MultiShareData(多线程共享变量)
- iOS多线程编程之NSThread的使用
- iOS多线程全套:线程安全问题,GCD的使用,NSOperation的使用
- Tensorflow并行计算:多核(multicore),多线程(multi-thread),图分割(Graph Partition)
- iOS 多线程 简单学习NSThread NSOperation GCD
- iOS 开发 多线程详解之线程安全(资源共享)
- iOS Coredata安全之多线程
- iOS多线程编程之NSThread的使用
- iPhone/iOS中保存自定义对象(Custom Object/Custom Class)的数组(NSMutableArray/NSArray)到NSUserDefaults
- IOS中的多线程实现:NSThread、GCD和NSOperation
- iOS-多线程(NSThread-线程之间的通信)
- 安卓学习第十四天:多线程的数据安全,线程同步,数组,类集框架
- IOS学习笔记23—多线程之NSThread、NSOperation、NSInvocationOperation
- iOS多线程编程之NSThread的使用
- ThreadSafeClientConnManager用来支持多线程的使用http client