問題タブ [nsrunloop]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iphone - nsrunloopのiPhoneココアの使用
グローバル変数と nsrunloop の組み合わせを使用して、アプリケーション全体で同期を強制していることに気づきました。それは機能しますが、私には少し醜いようです。同じ結果を達成する他の方法はありますか?
一般的な例を次に示します。
このコードでは、parkingSpots オブジェクトが完全に初期化されるまで待ってから updateLocation を初期化する必要があります。updatelocation は、parkingSpots が完全に初期化されることを想定しているため、runloop がないと updatelocation は適切に初期化されませんでした。runloop を使用すると、すべてが期待どおりに機能します。
ただし、これは非常に見苦しく見えます (コードのさまざまなポイントでグローバル変数を設定します)。よりエレガントなソリューションはありますか?よろしくお願いします。
objective-c - Objective-CでNSRunLoopを使用する方法は?
Objective-CでNSRunLoopを使用し、変数が値を変更するのを待つ方法を使用する方法は?
ありがとう
cocoa - [NSRunLoop runUntilDate] を終了するにはどうすればよいですか?
USB 経由で接続されたデバイスと通信する必要があるアプリケーションを作成しています。アプリは決まったタイミングでデバイスから順番にデータを送受信します。そうしないと UI がブロックされるため、すべての Rx/Tx は別のスレッドで発生します。基本的な構造は基本的にこのようになります。(自動解放プールなどは省略)
データを送信した後、アプリはデータが受信されるかrxTimeoutTimer
、パケットの再送信につながる起動するのを待ちます。基礎となるレイヤーが非同期システムコールを使用し、基本的にこのように見えるrx-handlerを呼び出すため、rx操作は機能します。
[runLoop runUntilDate:]
から抜け出す(簡単な)方法はありreceiveData:
ますか?Apple のドキュメントによると、すべてのタイマー ソースを削除しても、RunLoop が終了する保証はありません。電話について何か読んだことperformSelector:onThread:...
がありますが、うまくいかなかったか、要点がわかりませんでした。
ありがとう。
iphone - iPhone - appDidBecomeActive: と実行ループ開始の間で配列が失われましたか?
編集:配列を初期化した直後に配列を手動で保持するための単一の呼び出しに固執し、それで修正されました。デュル。ありがとう。
UIScrollView サブクラスに NSMutableArray を保持し、UIImageView サブクラスのインスタンスをそれぞれサブビューとして追加します。最終的には配列内の順序を再配置する予定であるため、変更可能な配列である必要があります。このバグは、私がそうしようとする前に発生しています。NSLogs を使用して、AppDelegate で applicationDidBecomeActive: が呼び出されるまで、配列が 10 カウントであることを示し、実行ループで 0.001 秒ごとに起動するタイマーを追加しました。初めて起動すると、配列が見つかりません! 私は非常に混乱しており、これを何時間も追跡しようとしています.
タイマーは正常に動作しています (つまり、printCount: が配列にアクセスしない場合は問題ありません)。そこで配列にアクセスしようとすると、タイマーが壊れます。以下の printCount: への通常の呼び出しは機能しますが、タイマーが最初に起動したときに、printCount: へのこれら 2 つの呼び出しの間で何が起こっている可能性がありますか?
私は、デバッガーを使用してプログラムを際限なくステップ実行してきました。配列はこの時点まで正しく、内容が変更された後でもそのメモリ アドレスは同じです。ただし、その後はオブジェクトしかありません。その 10 個の要素は、単一の UITouchData インスタンスに置き換えられます。どこから来たのかわからない。私のイベント処理メソッドはどれも、配列の再割り当てや変更を試みません。何がうまくいかないのでしょうか?私は完全に当惑しています。
iphone - iPhone アプリケーションから UIApplicationMain を削除するにはどうすればよいですか?
ゲーム ライブラリを iPhone に移植しようとしています。SDL とは異なり、このライブラリは main() 関数を完全に制御するわけではなく、独自のコードからすばやく返される関数を介して通信します。たとえば、明らかな疑似コードは次のとおりです。
iPhone では、返されない UIApplicationMain 関数を呼び出す必要があるため、これが困難になります。library_init(); の後でユーザー コードに戻る方法はまったくありません。
私はそれが必要であるとは確信していません-イベントを処理するために使用できると思われる NSRunLoop があります。ただし、UIApplicationMain が他に重要なことを行っているかどうかはわかりません。(私は .nib ファイルを使用する予定がないことに注意してください.nib ファイルは、UIApplicationMain が行うことがわかっている他の唯一のものです。)
思いつく現実的なアイデアが 3 つありますが、どれも大がかりな実装作業であるため、失敗したアイデアを試して 1 日を費やす前に、これを経験した人がいるかどうかを知りたいと思います。
- Init で新しいスレッドを生成し、そのスレッドで UIApplicationMain を実行します。スレッド間ですべてのイベントを通信するか (ugh)、単に UIApplicationMain スレッドをスリープ状態にして、メイン スレッドで CFRunLoop を使用します。ただし、UIApplicationMain は別のスレッドで実行されることを好まないと聞きました。
- UIApplicationMain を完全に無視し、NSRunLoop を使用してください。重要な iPhone の設定を忘れてしまうのでしょうか? 知るか!
- セットアップ後に UIApplicationMain コードから飛び出すために longjmp() で何か恐ろしいことを行い、ティアダウン中に重要なことを何もしないことを祈ります。
提案?
objective-c - OS X: NSRunLoop でソケット読み取りイベントを監視する方法は?
私はココアアプリを書いています。アプリケーションにはソケットがあり、ソケットが読み取り可能になるたびに、ソケットからデータを読み取り、データを処理し、それに応じてユーザー インターフェイスを更新したいと考えています。読み取りイベント チェックをメイン ループに統合したい。つまり、ソケットをメイン ループに接続し、ソケットが読み取り可能になるたびにメイン ループがコールバックを呼び出すようにしたい。
テスト アプリケーションを作成しましたが、何らかの理由で動作しません。
アプリは localhost ポート 1234 でリッスンすることになっており、誰かがサーバーに接続したりサーバーにデータを送信したりするたびに、アプリはコンソールに "Haiz" を出力することになっています。ただし、アプリはまったく何もしません。ソケットが作成され、ポート 1234 に telnet できますが、アプリはコンソールに何も出力しません。
私は何を間違っていますか?
objective-c - NSThread、AsyncSocket、およびオブジェクトの割り当て解除
AsyncSocket を使用するネットワーク コードがありますが、それを別の実行ループに移動します。次のコードでこのランループを作成しています。
_workerLoop は次のようになります (両方とも同じクラスにあります)。
現在、ドキュメントによると、NSThread はターゲットを保持し、このスレッドは AsyncSocket が切断されたときにのみ終了するため、ソケットが切断されるまでこのオブジェクトを解放して割り当てを解除することは不可能です。
どうすればこれを修正できますか、それとも何か間違っているのでしょうか?
iphone - NSRunLoopを起動し、空になるNSAutoreleasePoolがあることを確認するにはどうすればよいですか?
非同期ネットワーク操作を含むいくつかの「サブタスク」に依存する「同期」タスクがありますが、これらはすべて単一のにアクセスする必要がありますNSManagedObjectContext
。sのスレッド要件によりNSManagedObjectContext
、これらのサブタスクをすべて同じスレッドで実行する必要があります。これらのタスクのいくつかで実行される処理の量のために、私はそれらがバックグラウンドスレッド上にある必要があります。
現時点では、シングルトンSyncEngine
オブジェクトの-init
メソッドでこれを実行して、新しいスレッドを起動しています。
メソッドは次の-initializeSyncThread
ようになります。
NSRunLoop
これは、このスレッドを起動する正しい方法ですか?それを行うためのより良い方法はありますか?実行ループは「performSelector」ソースを処理するだけでよく、それ(およびそのスレッド)はプロセスの存続期間中存在する必要があります。
の設定に関してはNSAutoreleasePool
、Run Loop Observersを使用して自動解放プールを作成し、実行するたびにそれを排出することでこれを行う必要がありますか?
iphone - NSDate、NSTimer、およびNSRunLoopを使用して時限実行を設定する場合、アクションが完了する前にリリースする必要がないのはどれですか?
これを処理するコードの一部は次のとおりです。
でもループしているので、これをバンチャにしていきます。発砲が台無しにならないように、何を放っておく必要があるのかわかりません。
cocoa - runloop イベントの処理が完了したときに何かを行うにはどうすればよいですか?
私の Cocoa アプリには、イベントの結果として一連の作業を行うために、データの階層を介して呼び出す処理が時々あります。各小さなピースは、いくつかのリソースを作成および破壊します。ほとんどの場合、これらのリソースは必要ありませんが、すべての作業の前にそれらを作成し、最後にそれらを削除するスマートな方法を見つけたいと考えています.
これらのバッファなどを「親」または他の場所からグローバルに使用できるようにする以外に、イベント ループの実行が終了したときに一部のコードでローカルに知る方法はありますか? 次に、それらが存在しない場合はそれらを作成し、実行ループが終了するまでそれらを保持して、それ以前の後続の呼び出しでそれらを再利用できます。
編集:コードを再構築する方法についての提案を探しているわけではありません。この問題は、ランループがいつ完了したかを知る方法についての質問を引き起こしました。私が書き込みをしているとしたら、Javascript はわかりませんが、setTimeout
with zero を使用して終了イベントのクリーンアップを実行します。間隔がゼロの NSTimer もこれを達成できると思いますが、よりクリーンなものがあるかどうか疑問に思っています。
ありがとう。