2011-04-11 44 views
0

HI,我有在子類的NSOperation靜態的NSMutableArray * staticArray(在myOperation.m)和方法:調用延遲performSelector:在NSThread的靜態實例上?

靜態的NSMutableArray * staticArray = 零;

+(無效)初始化{

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不會從數組中移除。我錯過了什麼?謝謝...

+0

performSelector:... afterDelay:時間表選擇對**當前執行的線程**巫,,不存在任何更多afterDelay:30。我認爲這是問題!所以我試圖找到一種有效的方法來安排選擇器在延遲**之後在主線程**上執行。有任何想法嗎 ? – Vassilis 2011-04-11 16:25:28

回答

0

使用計時器(CFRunLoopTimer/NSTimer)和運行循環(CFRunLoop/NSRunLoop)apis來完成此操作。

在這種情況下,您將創建一個計時器,並將其添加到主運行循環中。

這也需要您爲您的計時器創建一個函數或方法來調用。如果你選擇一種方法,你可以使用NSInvocation(如果你喜歡的話)。

由於數據是靜態的,並且操作(可能)不會存在,所以可以通過類方法發送消息。

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

的而aStr將被刪除90秒後從staticArray中獲取。有關詳細信息...

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