我的应用程序每天执行一次处理方法,或者收到本地通知以执行一系列任务并按预期工作。
我尝试将ActivityIndicator添加到视图中,该视图在收到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];
}
必须在半透明子视图出现时发送通知,但是似乎没有调用任何处理方法,因此在我强行关闭应用程序之前视图将永久锁定。
发送通知是否会更改应用程序启动序列的当前流程,从而停止继续在类中执行代码?或者我是否已经尝试添加一个活动指示器,以便在幕后处理完全错误的方式时显示?
答案 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),这是最佳选择,因为它根本不会阻止用户界面。