1

から をロードしUIViewましたUIViewController。これUIViewには (big) が含まれますUICollectionViewUIView最初のビューから 2 番目のビューへの移行UIViewは非常に遅いです。すべてのコレクションのセルのレンダリングが完了すると、2 番目のビューが表示されるようです。2番目UIViewに、私は試しました。

- (void)viewDidAppear:(BOOL)animated
{
    [activityView stopAnimating];
    NSLog(@"did appear %@",[NSDate date]);
}
- (void)viewWillAppear:(BOOL)animated
{
      [super viewWillAppear:animated];
      [activityView startAnimating];
      NSLog(@"will appear %@",[NSDate date]);
}

ではNSLog、2 つのイベントの間に時間差はなく、実際にUIViewはイベントの約 1 秒後に 2 番目のイベントが表示されviewDidAppearます。この時点UIActivityIndicatorで、コードのように を開始します。しかし、インジケーターは表示されません。ヒントはありますか?

4

1 に答える 1

0

ここでの問題は、ディスク IO やネットワーク アクティビティ、または大量の計算を行ってメイン スレッドをブロックしている可能性があることです。そのため、この遅延が発生しています。

を表示しながら、これらすべてをセカンダリ スレッドで行うことをお勧めしますUIActivityIndicator。完了すると、アクティビティ インジケーターを非表示にして、コレクション ビューを表示できます。

編集:

注:おそらくもっと良い方法がありますが、私はコレクション ビューにあまり詳しくありません。

非常に簡単な修正はBOOL、コレクション ビューをロードするビュー コントローラーに ivar を保持することです。それを呼び出して、メソッドshouldLoadDataに設定NOしますviewDidLoadUICollectionViewDelegateあとは、メソッドnumberOfSectionsInCollectionView:とに 0 を返すだけですcollectionView:numberOfItemsInSection:

最後に、viewDidAppearメソッドでshouldLoadDataYES に設定し、 を呼び出しreloadDataますcollectionView。この時点で注意が必要なのは、アクティビティ インジケーターを停止できるように、コレクション ビューがいつデータの再読み込みを終了したかを知る方法を見つけることです。

それほどトリッキーではなくreloadData、メインスレッドでキューに入れるだけなので、 を呼び出した後、メインスレッドで別のタスクをキューに入れるだけでよいことがわかりましたreloadData。ただ行う:

[self.collectionView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{        
    [self.activity stopAnimating];
});

そして、あなたは望ましい行動を得るでしょう。ただし、これでもメイン スレッドがブロックされることに注意してください。 たとえば、戻るボタンがある場合、データが完全にロードされるまで押すことはできません (実際に押すことはできますが、それまでは目に見える効果はありません)。

于 2013-09-26T13:37:45.557 に答える