A simple adapter to helping using un-thread-safe object in a safe way.
using these methods to receive method call and redirect to the target object after thread safe processing.
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { return [[_container 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")) { /** 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(_dispatchQueue, ^{ [anInvocation invokeWithTarget:_container]; }); } else { /** 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(_dispatchQueue, ^{ [anInvocation invokeWithTarget:_container]; }); } }
JXMutableArray, you just need to declare the potocol and no need to implement them
@protocol JXMutableArrayProtocol @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 /** this array is mutable and thread-safe it provides some simple methods to operating an array it is not the fastest way but quite convenient */ @interface JXMutableArray : JXMultiThreadObject <JXMutableArrayProtocol> { } #import "JXMutableArray.h" @implementation JXMutableArray - (id)init { self = [super init]; if (self) { self.container = [NSMutableArray array]; } return self; } @end
JXMutableArray *ary = [[JXMutableArray alloc] init]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; queue.maxConcurrentOperationCount = 10; for (int i = 0; i < 200; i++) { NSNumber *number = [NSNumber numberWithInt:i]; [queue addOperationWithBlock:^{ [ary addObject:number]; }]; } [queue waitUntilAllOperationsAreFinished]; NSLog(@"%d",ary.count); NSLog(@"%@",ary);