开发者

Calling delayed performSelector: on a static instance from an NSThread?

HI, I have a static NSMutableArray* staticArra开发者_运维问答y in an NSOperation subclass (in myOperation.m) and a method:

static NSMutableArray *staticArray = nil;

+(void) initialize {

staticArray = [[NSMutableArray alloc] init];

}

-(void) addStrToStaticArray:(NSString*)aStr {
    if([staticArray indexOfObject:aStr] == NSNotFound) {
        [staticArray addObject:aStr];
        [staticArray performSelector:@selector(removeObject:)
                          withObject:aStr
                          afterDelay:30.];
    }
}

I call the above method and after that the operation finishes execution. The problem is that aStr is never removed from the array. What am I missing ? Thanks...


Based to Justin suggestions, I can now delayed remove an object from an array invoking the method from inside a NSThread, NSOperation despite their existence at the time of the removal:

NSMethodSignature * mySignature = [NSMutableArray instanceMethodSignatureForSelector:@selector(removeObject:)];
NSInvocation * myInvocation = [NSInvocation invocationWithMethodSignature:mySignature];
[myInvocation setTarget:staticArray];
[myInvocation setSelector:@selector(removeObject:)];
[myInvocation setArgument:&aStr atIndex:2];

//At this point, myInvocation is a complete object, describing a message that can be sent.

NSTimer *timer = [NSTimer timerWithTimeInterval:90.
                                     invocation:myInvocation 
                                        repeats:NO];

if(timer) {
    NSRunLoop *mainRL = [NSRunLoop mainRunLoop];
    [mainRL addTimer:timer forMode:NSDefaultRunLoopMode];
}

The aStr will be removed from staticArray after 90 seconds. For details...

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DistrObjects/Tasks/invocations.html


use timer (CFRunLoopTimer/NSTimer) and run loop (CFRunLoop/NSRunLoop) apis to accomplish this.

in that case, you create a timer, and add it to the main run loop.

this would also require that you create a function or method for your timer to call. if you choose a method, you could use an NSInvocation instead (if that's what you prefer).

since the data is static, and the operation (presumably) won't exist, you can message via a class method.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜