5

次のようなiOS開発のアドバイスを見るのは珍しいことではありません。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // work in background
    NSLog(@"%s work", __PRETTY_FUNCTION__);
    dispatch_async(dispatch_get_main_queue(), ^{
        // update UI on main queue
        NSLog(@"%s updateUI", __PRETTY_FUNCTION__);
    });
});

これは素晴らしいことですが、問題が発生したときにデバッグするのは難しい場合があります。出力を見てください:

AppName[1051:4013] __47-[Classname methodName]_block_invoke_0 work
AppName[1051:907] __block_global_0 updateUI

最初のログ行にはクラス名とメソッド名があるため、外側のブロックの問題を追跡する可能性があります(このメソッドで多くのブロックを定義していないことを願っています)が、2番目のログ行(内側のブロックから) ?特に、アプリでこのパターンを頻繁に使用している場合は、幸運を祈ります。

コンソール出力とクラッシュログでソースの場所を特定するのに役立つブロック名を付ける方法はありますか?

4

3 に答える 3

0

dispatch_async_fできることの1つは、ブロックの代わりに、およびの代わりに関数を使用することですdispatch_async。ただし、ブロックのインラインコードの性質と、コンテキストポインターを介して状態をマーシャリングすることなく状態をキャプチャする機能が失われるため、トレードオフは重要です。

また、外側のブロックの外側で内側のブロックを宣言し、それをローカル変数に格納することもできます。少し簡潔ではありませんが、外側のブロックのように、囲んでいるメソッドの名前でタグ付けします。

于 2013-01-01T02:45:33.413 に答える
0

https://github.com/conradev/BlockTypeDescriptionを使用して、開発中のログの読みやすさを向上させることができます。ただし、このライブラリはプライベート NSBlock クラスのメソッドを置き換えるため、アプリストア バイナリで使用しないでください。拒否される可能性があります。つまり、Apple から取得したクラッシュログを改善することはできません。

于 2013-03-31T12:56:29.747 に答える