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],这是工作在主线程上。

感谢所有作出答复。