监视后台线程

时间:2009-12-31 10:49:57

标签: iphone objective-c multithreading uiactivityindicatorview

我正在尝试监视我在后台运行的线程。我需要在完成执行时收到警报。

- (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”从网络中获取信息。

功能很好,但活动指标没有出现。我被告知我需要在后台线程和主线程上的动画上运行该过程。我现在的问题是如何监控此过程何时停止活动指示器。提前谢谢你

2 个答案:

答案 0 :(得分:4)

你应该从另一个角度考虑问题:你应该让你的“主线程”继续运行,让你的“辅助线程”在完成工作时调用主线程上的选择器。

要完成此操作,您应该使用performSelectorOnMainThread方法,并从辅助线程中调用它。它的原型是- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait。您应该将“完成”代码放在方法中,然后执行以下操作:

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

答案 1 :(得分:1)

谢谢你们。我终于得到了一个解决方案,感谢迈克和他的上述评论。

- (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]的另一种方式,它正在主线程上工作。

感谢所有回复的人。