1

ボタン アクションで 2 つのメソッドを呼び出しました。

- (IBAction)capture:(id)sender
{

         /*1*/   [self.capturingWindow capturePhoto]; //capture pictures and pass the paths to imagePathsArray

            NSLog(@"imagePathsArray.count---%d",imagePathsArray.count) ;
         /*2*/    [self displayImagesOnScrollView:imagePathsArray];
}

画像キャプチャ ボタンには、これら 2 つのメソッドがあります。

1. [self.capturingWindow capturePhoto]; //capture pictures and pass the paths to imagePathsArray

このメソッドは画像をキャプチャし、キャプチャした画像のパスを imagePathsArray に設定します

 2. [self displayImagesOnScrollView:imagePathsArray];

これらの入力された imagePathsArray を使用するこのメソッドは、

それぞれのイメージ ビューでイメージを表示します。

問題はmethod:1です。[self.capturingWindow capturePhoto]; imagesPathsArray へのパスをキャプチャしてロードするのに時間がかかります。

その間、メソッド:2[self displayImagesOnScrollView:imagePathsArray];その結果、境界を超えた配列が原因でクラッシュが発生します。

で試しました

 [ self performSelector:@selector(displayImages) withObject:nil afterDelay:1]

メソッドを直接使用する代わりに..

まだ役に立たない // 問題を 40% 減らしますが、それでも再現します

2 番目のメソッドは、最初のメソッドの後にのみ呼び出す必要があります。

ただし、遅延を少なく維持する方がよい (優先度が低い)

4

1 に答える 1

0

この種の発生は、マルチスレッド アプリケーションではかなり一般的です。コードが複数のスレッドで実行される可能性がある場合、コード内の順序に依存して実行される順序にすることはできません。capturePhotoバックグラウンドスレッドで作業の一部を行っている可能性が非常に高いようです。

では、その問題を解決するにはどうすればよいでしょうか。主にコールバックと通知。

コールバック- ここで を割り当てdelegate、重要なステップが発生するたびに、デリゲートは定義済みのメソッド呼び出しを取得します。これの良い例はNSURLConnectionNSURLConnectionDelegateです。

通知- これは、特定のイベントが発生したときにコードの一部がメッセージをブロードキャストするときです。イベントについて知りたい他のオブジェクトは、発生時にこれらのブロードキャストを受信するために通知センターに登録します。これらのオブジェクトは、送信される前にこれらの通知を登録する必要があります。これらについては、おそらく を使用し、作成して「投稿」NSNotificationCenterする通知などの既存の通知を登録したり、通知をリッスンしたりすることになるでしょう。applicationDidBecomeActive

どちらを使用する必要がありますか? どちらか一方をどのような状況でも機能させることができますが、どちらか一方が一貫して他方よりも簡単/優れた/機能的な場合があります。

  • 何かが起こったときに通知を受けたいオブジェクトがいくつかある場合は、おそらく通知が必要になるでしょう。
  • 同じメッセージが別の場所から届く可能性がある場合は、おそらく通知が必要になります。
  • 1 つのオブジェクトと 1 つのオブジェクトのみが、別のオブジェクトでイベントが発生するタイミングを知る必要がある場合、多くの場合、コールバックが必要になります。

しかし、当面の質問に戻ります。配列にデータが入力されるようにするには、コールバックまたは通知システムを作成してcapturePhoto、配列にデータが含まれていることを通知できるようにする必要があります。その時点で、配列の使用を開始できます。それまでは、プレースホルダー データを表示するか、場合によっては読み込みスピナーを表示する必要があります。

于 2013-04-29T15:38:54.797 に答える