【问题标题】:Monitoring background Threads监控后台线程
【发布时间】:2009-12-31 10:49:57
【问题描述】:

我正在尝试监视我设置在后台运行的线程。当它完成执行时,我需要得到提醒。

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

功能不错,但活动指示器没有出现。有人告诉我,我需要在后台线程上运行进程并在主线程上运行动画。我现在的问题是如何监视何时完成此过程以停止活动指示器。提前谢谢你

【问题讨论】:

    标签: iphone objective-c multithreading uiactivityindicatorview


    【解决方案1】:

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

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

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

    【讨论】:

    • 我试过那个方法,但是我理解的 UIActivity 需要在主线程上运行,操作系统把它放在那个线程上。这就是为什么我在后台运行我的方法。我只需要知道如何监控它
    • 考虑在 getSetDisplay 方法的末尾添加这样的内容:[activity performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:NO]
    • 你的线程 = [[NSThread alloc] init];似乎根本没有做任何事情。您正在那里产生一个线程,然后是另一个带有 performSelectorInBackground 调用的线程。上面的 cmets 可能是我要走的路......或者你可以使用 NSNotifications 在后台操作和前台操作之间传递消息。
    【解决方案2】:

    谢谢你们。感谢 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] 的另一种说法,它正在主线程上工作。

    感谢所有回复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 2017-08-15
      • 2017-03-10
      • 2016-02-21
      • 2014-07-16
      • 1970-01-01
      相关资源
      最近更新 更多