Objective c 从NSThread在静态实例上调用延迟performSelector:?

Objective c 从NSThread在静态实例上调用延迟performSelector:?,objective-c,static,selector,Objective C,Static,Selector,您好,我在NSOperation子类(在myOperation.m中)中有一个静态NSMutableArray*staticArray和一个方法: 静态NSMutableArray*静态数组= 零 +(无效)初始化{ staticArray = [[NSMutableArray alloc] init]; } 我调用上述方法,然后操作完成执行。问题在于,aStr从未从阵列中移除。我错过了什么?感谢…使用计时器(CFRunLoopTimer/NSTimer)和运行循环(CFRunLoop/NSR

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

静态NSMutableArray*静态数组= 零

+(无效)初始化{

staticArray = [[NSMutableArray alloc] init];
}

我调用上述方法,然后操作完成执行。问题在于,aStr从未从阵列中移除。我错过了什么?感谢…

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

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

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


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

根据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];
}
aStr将在90秒后从静态阵列中移除。有关详细信息


performSelector:…afterDelay:计划在当前线程上执行选择器,afterDelay:30不再存在。我想这就是问题所在!因此,我试图找到一种有效的方法来安排在延迟后在主线程上执行选择器。有什么想法吗?
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];
}