0

我想監視一個線程,我設置在後臺運行。當它完成執行時我需要提醒。監控後臺線程

- (IBAction) btnGreaterTen_clicked :(id)sender{ 

    self.searchDistance = [NSNumber numberWithDouble : 10]; 

    CGRect frame = CGRectMake (120.0, 185.0, 80, 80); 

    activity = [[UIActivityIndicatorView alloc] initWithFrame: frame]; 
    activity.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; 


    [navigationUpdateFromDetail.window addSubview: activity]; 


    [activity startAnimating]; 


    thread = [[NSThread alloc] init]; 
    [thread start]; 

[self performSelectorInBackground: @selector (getSetDisplay) withObject:nil];   

if(thread.isFinished == YES){ 
    [activity stopAnimating]; 
} 
} 

上面的代碼我嘗試不同的設置以達到最終結果後有什麼。我正在嘗試動畫UIActivityIndi​​cator,同時我使用該方法「getSetDisplay」從網上獲取信息。

功能是好的,但活動指示燈不上來。我被告知我需要在後臺線程上運行該進程,並在主線程上運行該動畫。我現在的問題是如何監控此過程何時停止活動指示器。謝謝你提前

回答

4

你應該從不同的角度考慮問題:你應該讓你的「主線」繼續運行,並且讓你的「輔助線程」調用主線程上選擇當它完成做功。

要做到這一點,你應該使用performSelectorOnMainThread方法,並從您的輔助線程調用它。其原型是- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait。你應該把你的「整理」代碼放在一個方法中,然後做類似的事情:

[self performSelectorOnMainThread:@selector(doneDoingWork) withObject:nil waitUntilDone:NO]; 
+0

我試過的方法,但是從我瞭解的需求UIActivity主線程上運行,操作系統把它放在該線程。那就是爲什麼即時在後臺運行我的方法。我只需要知道如何監控它 – Makinitez21 2009-12-31 10:54:06

+4

考慮在你的getSetDisplay方法的末尾加上類似的東西: '[activity performSelectorOnMainThread:@selector(stopAnimating)withObject:nil waitUntilDone:NO]' – Mike 2009-12-31 10:57:20

+1

Your thread = [ [NSThread alloc] init];似乎沒有做任何事情。你正在那裏產生一個線程,然後是另一個帶有performSelectorInBackground調用的線程。 以上說法可能是我要走的路...或者你可以在後臺運算和前景OP之間使用NSNotifications來的消息。 – Hunter 2009-12-31 16:28:28

1

謝謝你們。我終於得到了一個解決方案,這得益於Mike和他的上述評論。

- (IBAction) btnGreaterTen_clicked :(id)sender{ 

self.searchDistance = [NSNumber numberWithDouble : 10]; 


[activity startAnimating]; 

NSLog(@" search value after change %@", [searchDistance description]); 

[self performSelectorInBackground: @selector (getSetDisplay) withObject: nil]; 
} 

我使用在主線程上運行的「[activity startAnimating]」開始了活動指示器。然後我用「performSelectorInBackground」在後臺線程上開始我的方法。在我的「getSetDisplay」方法的最後,我放置了下面的語句。

[activity performSelectorOnMainThread: @selector (stopAnimating) withObject:nil waitUntilDone:NO]; 

這只是另一種說法[活動stopAnimating],這是工作在主線程上。

感謝所有作出答覆。