是否有可能performSelector:withObject:afterDelay:
在子線程中不起作用?不適用於NSThread:performSelector:withObject:afterDelay:?
我還是新來的目標C和Xcode所以也許我錯過了一些明顯的東西......:/我真的很感謝一些幫助。
我想要做的就是顯示infolabel 3秒鐘,之後它將被隱藏。如果設置了新信息,3秒後隱藏標籤的線程將被取消。 (我不想通過舊線隱藏的新信息。)
源代碼:
- (void) setInfoLabel: (NSString*) labelText
{
// ... update label with text ...
infoLabel.hidden = NO;
if(appDelegate.infoThread != nil) [appDelegate.infoThread cancel]; // cancel last hide-thread, if it exists
NSThread *newThread = [[NSThread alloc] initWithTarget: self selector:@selector(setInfoLabelTimer) object: nil];// create new thread
appDelegate.infoThread = newThread; // save reference
[newThread start]; // start thread
[self performSelector:@selector(testY) withObject: nil afterDelay:1.0];
}
-(void) setInfoLabelTimer
{
NSLog(@"setInfoLabelTimer");
[self performSelector:@selector(testX) withObject: nil afterDelay:1.0];
[self performSelector:@selector(hideInfoLabel) withObject: nil afterDelay:3.0];
NSLog(@"Done?");
}
-(void) testX
{
NSLog(@"testX testX testX testX testX");
}
-(void) testY
{
NSLog(@"testY testY testY testY testY");
}
-(void) hideInfoLabel
{
NSLog(@"f hideInfoLabel");
if(!([[NSThread currentThread] isCancelled])) {
AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
appDelegate.infoThread = nil;
appDelegate.infoLabel.hidden = YES;
[NSThread exit];
}
}
控制檯產出:
- setInfoLabelTimer
- 完成?
- 暴躁易怒暴躁易怒暴躁
正如你可以看到performSelector:withObject:afterDelay:
不工作(--->「暴躁易怒暴躁易怒暴躁的」),但不是在子線程(它運行(--->「setInfoLabelTimer 「和」完成?「))
有沒有人知道爲什麼performSelector:withObject:afterDelay
:不工作在子線程? (或者有什麼是我的錯?:()
最好的問候, 茶壺
是的,它不工作。任何視圖相關的東西都必須是主要的。 –
testx和testy方法在.h中定義? –
你不應該搞亂後臺線程中的UIKit對象。 – bbum