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

2 回答 2

4

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

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

[self performSelectorOnMainThread:@selector(doneDoingWork) withObject:nil waitUntilDone:NO];
于 2009-12-31T10:51:34.553 回答
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];

这只是在主线程上工作的 [activity stopAnimating] 的另一种说法。

感谢所有回复的人。

于 2010-01-03T00:21:27.523 回答