0

我的应用程序每天执行一次或在收到本地通知时执行一系列处理方法以执行一系列任务并按预期工作。

我尝试将 ActivityIndi​​cator 添加到视图中,当收到从 AppDelegate 发送来执行任务的通知时,该视图开始动画。然而,所发生的只是屏幕变暗,没有任何处理完成,活动指示器也没有出现。使屏幕变暗的指示器和子视图在应用程序的其他地方使用,并且肯定可以正常工作。我认为这一定与导致应用程序挂起并且没有继续调用任何其他方法的通知有关,因此它永远不会完成。

这是应用程序委托中的通知,在调用日常处理方法以启动视图控制器中的活动指示器之前调用,第二个通知视图控制器删除子视图。

该方法在 AppDelegate 中;

- (void)GoForRankingAndSMProcessing{

    [[NSNotificationCenter defaultCenter] postNotificationName:@"ranking" object:self];

    RankingAndSMProcess *process = [RankingAndSMProcess alloc];

    [process DoRankingAndSocialMediaProcessing];

    [process release];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"rankingDone" object:self];


}

这是在另一个视图中拾取的,通知设置在viewDidLoad.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(workingWhileRanking:) name:@"ranking" object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(workingFinishedRanking:) name:@"rankingDone" object:nil];

那些在那个视图中调用这些方法。

-(void)workingWhileRanking:(NSNotification *) notification{

    loading = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 

    loading.opaque = NO;
    loading.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.6f];

    indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    [indicator setHidesWhenStopped:YES];
    indicator.center = self.view.center;

    [indicator startAnimating];
    [self.view addSubview:loading];
    [self.view addSubview:indicator];

}

-(void)workingFinishedRanking:(NSNotification *) notification{

    [indicator stopAnimating];
    [indicator removeFromSuperview];
    [indicator release];
    [loading removeFromSuperview];
    [loading release];

}

通知必须在半透明子视图出现时发送,但是似乎没有调用任何处理方法,因此视图被永久锁定,直到我强制关闭应用程序。

发送通知是否会更改应用程序启动序列的当前流程,从而停止继续执行类中的代码?或者我是否尝试添加一个活动指示器以在某些幕后处理完全错误的方式期间显示?

4

1 回答 1

2

如果我没有正确解释您的代码:

- (void)GoForRankingAndSMProcessing{

  [[NSNotificationCenter defaultCenter] postNotificationName:@"ranking" object:self];
  RankingAndSMProcess *process = [RankingAndSMProcess alloc];
  [process DoRankingAndSocialMediaProcessing];
  [process release];
  [[NSNotificationCenter defaultCenter] postNotificationName:@"rankingDone" object:self];
}

yourDoRankingAndSocialMediaProcessing是您在活动指示器显示时要执行的任务。

我假设所有处理都发生在同一个线程(UI 线程)上,这意味着当您DoRankingAndSocialMediaProcessing基本上执行运行循环(因此,UI)阻塞并且它不再更新时。这应该可以解释您的问题。

您有几个选项可以更改此行为,具体取决于您在DoRankingAndSocialMediaProcessing.

如果你不做任何与 UI 相关的事情,那么通过将直接调用替换为DoRankingAndSocialMediaProcessing

[process performSelectorInBackground:@selector(DoRankingAndSocialMediaProcessing) withObject:nil];

当然,然后您会rankingDone从内部发送通知DoRankingAndSocialMediaProcessing以使事情正常工作。

如果您负担得起后台线程(即,您不从内部更新 UI DoRankingAndSocialMediaProcessing),这是最好的选择,因为它根本不会阻塞 UI。

于 2012-07-24T16:12:40.827 回答