おそらく、私のコードの10.6で問題に気づいたようです。
私は完全に非同期的な方法で(ほとんどBGPとASのものに関する)ネットワーク情報を得る必要がありました。私にとって理想的な解決策は、公然とアクセス可能なDNSサーバーに特別なDNS TXTレコード要求を送信することですが、Cocoa/Core Foundationはこれらの種類の奇妙なボールDNS要求を行うためのAPIを提供していません。もう1つの方法はshell% whois -h IP 'SPECIAL REQUEST'
を使用して、関連する情報を出力から解析することでした。これは私が数時間で立ち上げて実行し、後で戻って真の解決策をとることができるものでした。非常にハッキリですが、1)適切な非同期DNSライブラリを見つけて2)そのAPIの速度を上げ、おそらくラッパーを作成するよりもずっと速いです。
したがって、whois
リクエストを開始するために、バックグラウンドスレッドをフォークするクラスを作成し、次にNSTask
を作成しました。バックグラウンドスレッドは結果を処理するためにNSRunLoop
ループ内に座っていますが、何らかの理由でNSTask
が死んだか、または[NSThread isCanceled]
などであるかどうかを確認するために毎秒〜1/10秒ごとにチェックします。NSApplicationWillTerminateNotification
通知も登録できるようにしますアプリが終了している場合は適切なクリーンアップ。
まあ、10.6から...私はもう「すぐに」辞めることができませんでした。 10.5では、すべてが滑らかなガラスであり、アプリケーションは少なくとも知覚的に即座に終了します。 10.6未満で終了すると、アプリがハングします。デバッグでは、全てが詰まっていたことがわかりました.が残っていました。私がこの方法で入手した情報はどれも、アプリの機能にとって重要なものではないので(情報の種類を知っているといいです)、私はちょっとパントして、停止ギャップソリューションとして情報を取得しようとしませんでした。
問題をデバッグするときのクイックパスは、メインアプリケーションがインスタンスNSLock
を取得しようとしたときにブロックされていることを示しました。面白いのは、アプリケーションを単なるままにしておくと、アプリケーションは10-20秒から数分の間にどこかで正常に終了するということです.ブロック内に括弧で囲まれたコードが10.5と10.6の間で変更され、 。私はまだそれが起こっている場所を(まだ優先順位ではないが)追跡する必要がある....それらのうちの1つは、それがまだ実行中で、それが安全にそのNSPipe
のようなものを取り除くことができる前に、それが完了するのを待っているなら、背景NSTask
を終了しています。
DUP:これはデュープの回答かもしれません...私の最初のものはいずれかに消えたようですか?私はどこに問題があった
[NSThread detachNewThreadSelector: @selector(foo) toTarget: self withObject: task];
...
- (void) foo: (NSTask *) task {
[task launch];
[task waitUntilExit];
...
:
出口0を単に引っ張る単純なスクリプトを置き換えるとどうなりますか?あなたが今使っているもののために? –
私は、上記のコードが時には完了し、時には完了までに数秒かかりそうな同様の問題を抱えています。本当に奇妙です! – Locksleyu