0

アプリに3つの画面があります。最初はログインです。2つ目は検索で、3つ目はタスクの処理です。ログイン時に、Webサービスからデータを取得します。XML形式でデータを返します。したがって、データはかなり大きくなります。だから私はメインスレッドがフリーズするのを防ぐためにこのようなバックグラウンドスレッドでそのタスクを実行しています:

-(BOOL)loginEmp
{
 .....some computation
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                                 (unsigned long)NULL), ^(void) {
            [self getAllCustomerValues];
        });
}
 -(void)getAllCustomerValues
{
   ....more computation.Bring the data,parse it and save it to CoreData DB.
   //notification - EDIT

NSNotification *notification =[NSNotification notificationWithName:@"reloadRequest"
                                                            object:self];
[[NSNotificationCenter defaultCenter] postNotification : notification];

}
 //EDIT

//SearchScreenVC.m
- (void)viewDidLoad
{
 ....some computation
    [self.customerActIndicator startAnimating];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(stopActivityIndicator)
                                             name:@"reloadRequest"
                                           object:nil];
  }
 - (void)stopActivityIndicator
{
[self.customerActIndicator stopAnimating];
self.customerActIndicator.hidesWhenStopped = YES;
self.customerActIndicator.hidden =YES;
NSLog(@"HIt this at 127");
}  

したがって、ログインが成功したことを条件に、画面2に移動します。ただし、バックグラウンドスレッドはまだ処理中です(ログログ値があるためわかります)。ここ(2番目の画面)にアクティビティインジケーターが表示され、ユーザーが検索を開始するまで待つように指示します。では、どうすればよいですか?アクティビティインジケーターにバックグラウンドスレッドをリッスン/待機させるにはどうすればよいですか?さらに情報が必要な場合はお知らせください。ありがとうございます

編集:それに応じて編集しましたが、通知が呼び出されることはありません。getAllCustomerValuesの最後に通知を置き、SearchScreenのviewDidLoadでそれを使用しました。アニメーションを停止するための2番目の画面でのその通知は呼び出されません。私がしている間違いは何ですか?ありがとう

編集2:それで最終的にメソッドにヒットします。何がその方法を打ったのかわかりません。ブレークポイントを置きます。私はアニメーションをやめるように書いたが、そうはならなかった。私はhidesWhenStopppedを書き、両方をYESに隠しました。しかし、それでもアニメーションを続けます。どうすれば停止できますか?

4

3 に答える 3

1

わかりました、それがメインスレッドでない場合は、次を入れて修正してください。

- (void)stopActivityIndicator
{
      if(![NSThread isMainThread]){
         [self performSelectorOnMainThread:@selector(stopActivityIndicator) withObject:nil waitUntilDone:NO];
          return;
       }

 [self.customerActIndicator stopAnimating];
  self.customerActIndicator.hidesWhenStopped = YES;
   self.customerActIndicator.hidden =YES;
  NSLog(@"HIt this at 127");
 }  
于 2013-01-25T03:28:23.430 に答える
0

バックグラウンド操作を別のクラスに入れ、その上にデリゲートを設定して、操作が完了したらデリゲートにアラートを出すことができますか?

私はこれを試していません、それは単なるアイデアです:)

于 2013-01-24T10:37:12.613 に答える
0

ビュー コントローラを指すデリゲートと、次のようなビュー コントローラのメソッドを使用できます。

- (void) updateProgress:(NSNumber*)percentageComplete { 
}

そして、バックグラウンド スレッドで:

float percentComplete = 0.5; // for example
NSNumber *percentComplete = [NSNumber numberWithFloat:percentComplete];

[delegate performSelectorOnMainThread:@selector(updateProgress:) withObject:percentageComplete waitUntilDone:NO];
于 2013-01-24T17:35:29.267 に答える