32

私は iOS 開発にかなり慣れていませんが、より複雑な概念のいくつかを理解し始めています。私は現在、ビデオをキャプチャするために AVCam を実装するアプリケーションを持っています。AVCam は別のスレッドで作成されますが、メインの xib ファイルにあるビューを使用します。カメラがキャプチャを完了すると、ViewController クラスの完全な関数が呼び出されます。完全な関数内で、UI といくつかの NSLog を更新する他の多くの関数を呼び出します。コンソールにすぐにログが表示されますが、UI の更新にはさらに 3 秒かかります。計測器を使用して問題のあるコードを見つけようとしましたが、見つけられないようです。UI によって何がブロックされているかを判断する別の方法はありますか?

記録が完了したときに呼び出されるコードは次のとおりです。

-(void)movieRecordingCompleted{
       [HUD hide:YES];
        NSLog(@"movieRecordingCompleted");
        [self showModalViewController];
        NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mov"];
        NSLog(@"pathToMovie: %@", pathToMovie);
        pathToTreatedVid = pathToMovie;
        NSLog(@"File Save Called");
        UISaveVideoAtPathToSavedPhotosAlbum(pathToMovie, nil, NULL, NULL);
}

すべてがすぐにログに記録されますが、プログレス HUD とモーダル ビュー コントローラーが約 2 ~ 5 秒間トリガーされず、非常に奇妙です。

これは、スレッドの前後の状態です (凍結されたときと凍結解除されたとき)。 ここに画像の説明を入力 ここに画像の説明を入力

4

6 に答える 6

51

プログラムの実行を一時停止してみてください(Xcode3番目のパネルの下部にボタンがあります)

一時停止

  • 次に、左パネル ( Navigator panel) を見て、
  • 探すDebug Navigator

デバッグナビゲーター

  • 関数を含むスレッドを見つけmainてください。このスレッドのメソッドによって、UI の更新に時間がかかる原因を突き止めることができます。現在動作しているメソッドは、通常、一番上の黒いメソッドです (灰色でリストされobj-cた内部メソッド)。

主要

于 2013-04-10T14:09:03.107 に答える
8

Time Profilerを使用して、アプリをブロックしているものを見つけることができます。

于 2013-04-10T14:07:41.617 に答える
-13

私はこの機能を使用するのが好きです:

sleep(x);

ここで、「x」は秒数です...その秒数で実行されているスレッドを単にブロックします。UI がフリーズした場合は、メイン スレッドがブロックされていることがわかります。そのため、そのコードはメイン スレッドで実行されています (意図したかどうかに関係なく)。この呼び出しをコード内のさまざまな場所に配置してみてください。何が起こっているのかを診断するのに役立ちます。それが役立つことを願っています。

于 2013-04-10T14:07:21.623 に答える