jamztang
10/2/2011 - 5:37 PM

Easily perform list of operations on specific NSOperationQueue through NSProxy

Easily perform list of operations on specific NSOperationQueue through NSProxy

//
//  JTInvocationManager.m
//
//  Created by James Tang on 02/10/2011.
//

#import "JTInvocationManager.h"

@implementation JTInvocationManager

- (id)init {
    _invocations = [[NSMutableArray alloc] init];
    return self;
}

- (void)dealloc {
    [_proxiedTarget release];
    [_invocations release];
    [super dealloc];
}

#pragma mark Instance methods

- (id)prepareWithInvocationTarget:(id)target {
    [_proxiedTarget autorelease], _proxiedTarget = nil;
    _proxiedTarget = [target retain];
    return self;
}

- (void)removeAllInvocations {
    [_invocations removeAllObjects];
}

- (NSArray *)operations {
    NSMutableArray *ops = [NSMutableArray array];
    for (NSInvocation *invocation in _invocations) {
        NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithInvocation:invocation];
        [ops addObject:operation];
        [operation release];
    }
    return [NSArray arrayWithArray:ops];
}

- (void)invokeOnQueue:(NSOperationQueue *)queue waitUntilFinished:(BOOL)wait {
    // Simply avoid -[NSOperationQueue addOperations:waitUntilFinished:]
    // for iOS 3 compatibility reason
    for (NSOperation *operation in [self operations]) {
        [queue addOperation:operation];
    }
    if (wait) {
        [queue waitUntilAllOperationsAreFinished];
    }
}

- (void)invoke {
    for (NSInvocation *invocation in _invocations) {
        [invocation invoke];
    }
}

#pragma mark NSProxy

- (void)forwardInvocation:(NSInvocation *)invocation {
    // Do not invoke now, reserve until `invoke` called.
    [invocation setTarget:_proxiedTarget];
    [_invocations addObject:invocation];
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
    return [_proxiedTarget methodSignatureForSelector:sel];
}

#pragma mark Class method

+ (id)invocationManager {
    return [[[JTInvocationManager alloc] init] autorelease];
}

@end
//
//  JTInvocationManager.h
//
//  Created by James Tang on 02/10/2011.
//

#import <Foundation/Foundation.h>

@interface JTInvocationManager : NSProxy {
    id _proxiedTarget;
    NSMutableArray *_invocations;
}

+ (id)invocationManager;

- (id)prepareWithInvocationTarget:(id)target;

- (void)removeAllInvocations;
- (NSArray *)operations;
- (void)invokeOnQueue:(NSOperationQueue *)queue waitUntilFinished:(BOOL)wait;
- (void)invoke;

@end