0

私のアプリケーションは、一連の処理メソッドを1日1回実行するか、一連のタスクを実行するためのローカル通知を受信したときに実行し、期待どおりに機能しています。

タスクを実行するためにAppDelegateから送信された通知を受信すると、アニメーションを開始するビューにActivityIndi​​catorを追加してみました。ただし、画面が暗くなり、処理が行われず、アクティビティインジケータが表示されないだけです。画面を暗くするインジケーターとサブビューは、アプリの他の場所で使用されており、確実に機能しています。通知が原因でアプリがハングし、他のメソッドの呼び出しに進まないため、アプリが完了しないことが関係していると思います。

これは、ビューコントローラーのアクティビティインジケーターを開始するために毎日の処理メソッドが呼び出される直前に呼び出されるアプリデリゲートの通知であり、2番目の通知はビューコントローラーにサブビューを削除するように通知します。

このメソッドは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 に答える