调用延迟的performSelector:来自NSThread的静态实例?

时间:2011-04-11 04:19:13

标签: objective-c static selector

HI,我在NSOperation子类中(在myOperation.m中)有一个静态NSMutableArray * staticArray和一个方法:

  

static NSMutableArray * staticArray =   无;

     

+(void)初始化{

staticArray = [[NSMutableArray alloc] init];
     

}

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

我调用上面的方法,之后操作完成执行。问题是aStr永远不会从数组中删除。我错过了什么?感谢...

2 个答案:

答案 0 :(得分:1)

根据Justin的建议,我现在可以延迟从NSThread内部调用该方法的数组中删除一个对象,尽管NSOperation在删除时存在,但仍然存在:

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];
}

90秒后,aStr将从staticArray中删除。详情......

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

答案 1 :(得分:0)

使用计时器(CFRunLoopTimer / NSTimer)并运行循环(CFRunLoop / NSRunLoop)apis来完成此任务。

在这种情况下,您创建一个计时器,并将其添加到主运行循环。

这还需要您为计时器创建一个函数或方法来调用。如果你选择一个方法,你可以使用NSInvocation(如果这是你喜欢的)。

由于数据是静态的,并且操作(可能)不存在,您可以通过类方法发送消息。