NSNotificationCenter AppDelegate发布通知问题

时间:2012-07-24 14:30:05

标签: ios uiactivityindicatorview nsnotificationcenter nsnotifications nsnotification

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

我尝试将ActivityIndi​​cator添加到视图中,该视图在收到AppDelegate发送的执行任务的通知时开始动画。然而,所有发生的事情都是屏幕变暗,没有完成任何处理,活动指示也不会出现。使屏幕变暗的指标和子视图在应用程序的其他地方使用,绝对有效。我认为这必须与导致应用程序挂起的通知有关,而不是继续调用任何其他方法,因此它永远不会完成。

这是app delegate中的通知,它在调用每日处理方法之前调用,以在视图控制器中启动活动指示器,第二个通知视图控制器删除子视图。

此方法位于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];

}

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

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

1 个答案:

答案 0 :(得分:2)

如果我没有错误地解释你的代码:

- (void)GoForRankingAndSMProcessing{

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

您的DoRankingAndSocialMediaProcessing是您希望在活动指示符显示时执行的任务。

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

您可以通过多种方式更改此行为,具体取决于您在DoRankingAndSocialMediaProcessing中执行的操作。

如果你没有做任何与UI相关的事情,那么在后台线程上执行该方法非常容易,只需将对DoRankingAndSocialMediaProcessing的直接调用替换为:

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

当然,您会在rankingDone内发送DoRankingAndSocialMediaProcessing通知,以使工作正常。

如果您能负担后台线程(即,您没有在DoRankingAndSocialMediaProcessing内更新UI),这是最佳选择,因为它根本不会阻止用户界面。