問題タブ [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.
objective-c - 異なる NSThread/NSRunLoop で NSTimer を実行および管理する
Interface Builder で設計された GUI を使用して、Cocoa アプリケーションを作成しています。UI をブロックせずに (定期的に) バックグラウンド アクティビティをスケジュールする必要があるため、次のように別のスレッドで実行します。
タイマーを保持しているので、簡単に無効にして再スケジュールできます。
問題: GUI イベントに応答して run: メソッドも起動する必要があるため、これは同期的です (つまり、「アクティビティを実行する」ボタン)。このような:
performSelectorInBackground でもこれを行うことができ、もちろん UI をブロックしません。しかし、この同期発火は別の実行ループで実行されます! したがって、それらが重複しないという保証はありません。同じ実行ループですべての発火をキューに入れるにはどうすればよいですか?
iphone - NSTimer と UI の更新
私は自分のゲームをNSTimer
. 多くの人が私と同様の問題を抱えているのを見てきましたが、何かについて少し説明が必要です.
基本的にNSTimer
、時間を表す画像を更新しているメインスレッドで実行していますが、mapView もあります。ユーザーがマップをパンすると、タイマーがブロックされます。私の質問は、新しいスレッドを作成してタイマーをその実行ループに追加した場合、セレクター (UI を更新する) を実行すると、タイマー スレッドが再びブロックされないのでしょうか? また、セカンダリ スレッドから UI を更新するのは悪い習慣であることもわかっています。
更新:両方が同じ実行ループで実行されていたため、mapView がタイマーをブロックしていたと思います。独自の実行ループを持つタイマースレッドでこれを修正しましたが、これにより2番目の問題が発生し、非常に行き詰まりました!! これがコードです...
このコードにより、[プールのドレイン] で Bad_access エラーが発生します。
計測器でコードを実行しましたが、エラーが発生する理由がわかりません。何か案は?
iphone - タイマーでトリガーされたランループを停止する方法は?
そのようなランループを設定した場合:
もう一度止めてもいいですか?または、さらなるアクションをトリガーするために使用する通知を無視する唯一の方法ですか?
わかりました、私は問題の例を挙げます:
}
確かに、いくつかのエラーがあります - 間違いありません。しかし、それは私の問題を示していると思います。これは今までの答えでは本当に解決できません。
タイマーを実行し、後で停止する必要があります。理想的には、クラス内の別の機能から外します。しかし、その後、「タイマー」にアクセスできなくなり、そのような「メッセージ」が利用可能かどうかをrunloopは把握できません。関数の呼び出しごとに新しいタイマーを登録すると、非常に効果がなくなります。
iphone - Cocoa実行ループ入力ソース
iPhoneアプリケーションを作成していますが、バックグラウンドでファイルをダウンロードする必要があります。ファイルのダウンロード部分は処理できますが、背景部分についてはよくわかりません。私の現在のアイデアは、実行ループを使用して、ユーザーがダウンロードするファイルを選択するまで待機することです。これは機能しているように見えますが、入力ソースが設定されていない場合、実行ループは終了します。ただし、Appleのドキュメントには、事前定義されたカスタム入力ソースについての説明があり、関数
performSelector:onThread:withObject:waitUntilDone:を使用して関数
を実行できます。その入力ソースを実行ループに追加する方法を知りたいのですが。
objective-c - 非同期クラスをラップして同期させる方法は? NSRunLoop を使用しますか?
私は現在 iPhone アプリに取り組んでおり、非同期動作をするサードパーティのライブラリを持っていますが、独自のクラスでラップして同期的に見せたいと思っています。
このライブラリの中心的なクラス (接続クラスと呼びましょう) には、デリゲート クラスのインスタンスのメソッドが呼び出されたときに最終的な結果が解決されるいくつかの関数があります。私がやろうとしているのは、このクラスとデリゲートをラップして、非同期ではなく同期に見えるようにすることです。Java でこれを行う場合、FutureTask または CountdownLatch を使用するか、単に join() を使用します。しかし、Objective C でこれを行う最善の方法がわかりません。
上記のデリゲート プロトコルに準拠する NSThread 拡張機能 NFCThread を作成することから始めました。アイデアは、init と NFCThread、NFCThread インスタンスを Connection の setDelegate メソッドに渡し、スレッドを開始してから、Connection で非同期メソッドを呼び出すというものです。NFCThread インスタンスの 3 つのデリゲート メソッドのいずれかが呼び出され、最終的にスレッドが終了すると予想されます。
結合をシミュレートするために、次のことを行いました。NFCThread に NSConditionalLock を追加しました。
Connection の呼び出しの周りのコードは次のようになります。
デリゲートのプロトコルには 3 つのメソッドがあります。NFCThread では、各メソッドを次のように実装しました。
NFCThread のメイン メソッドをオーバーロードして、継続的にループするようにしました。このようなもの:
これは、CPU の使用率が非常に高くなるため、あまり良い考えではないことがわかりました。代わりに、このサイトで見つけたいくつかの例から実行ループを使用してみました。
私の実装の両方で、メイン スレッドは常にブロックされており、どのデリゲート メソッドも呼び出されていないように見えます。ただし、ライブラリが正常に機能していることと、デリゲート メソッドへの呼び出しが正常に呼び出されることはわかっています。
ここで明らかな何かが欠けているように感じます。どんな助けでも大歓迎です。
リッチ
iphone - NSConnectionメッセージに対してperformSelectorOnMainThreadを優先するにはどうすればよいですか?
ダウンロードがたくさんありNSURLConnection
ます。メインスレッドでは発生しない可能性があります。それらのいくつかが終了したらperformSelectorOnMainThread
、別のシングルトンオブジェクトを要求します。
performSelectorOnMainThread
実行ループモード( )を指定する場合と指定しない場合の両方の形式を使用しましNSDefaultRunLoopMode
た。 NSDefaultRunLoopMode
セレクターを回避することになってNSConnection
いますが、メッセージはセレクターにゲートされているように見えます。示されたセレクターは、保留中のすべての接続が完全にダウンロードされるまで実行されません。
performSelectorOnMainThread
他の人より先に起こることをどのように優先しますか?
objective-c - NSAutoreleasePool でスレッド メソッドから戻った後の NSRunLoop でのエラー
NSAutoreleasePool を設定したスレッド メソッドから戻ると、EXC_BAD_ACCESS エラーが発生します。失敗の場所は、NSRunLoop への呼び出しにあります。主にクラス(接続クラスと呼びましょう)とそのデリゲートで構成されるサードパーティライブラリをラップして、クライアントクラスに対して非同期ではなく同期的に動作するようにしようとしています。NFCConnection と呼ばれるラッピング クラスはデリゲート プロトコルに準拠し、NFCConnection のコンストラクターで Connection の setDelegate メソッドに渡されます。
新しいスレッドを作成する方法は次のとおりです。
スレッド メソッド doSomethingImportant は次のようになります。
Connection の somethingImportant を呼び出すと、デリゲート メソッドの 1 つがメイン スレッドで呼び出されます。これらのコールバック メソッドのそれぞれで、変数 callBackMethod を NO に設定し、methodA の while ループを終了させます。エラーは、doSomethingImportant が返された後、デリゲート メソッドの 1 つが呼び出される前に発生します。EXC_BAD_ACCESS エラーは、NSRunLoop の呼び出しで発生します。スタック トレースの一部を次に示します。
これで、エラーの発生をまったく防ぐことができ、doSomethingImportant で自動解放プールの設定を怠ると、ラップされた API が同期的に動作するように見えます。しかし、それを行うと、コンソールに次のように出力されます。
上記のメッセージは、Connection クラスのインスタンスで何かが解放されていないことが原因ですか? 私は NSDate を作成していますが、リリースする必要があるインスタンスではありません。NSTimer と同じことです。
ここで NSAutoreleasePool を設定して正しいことをしようとしていますが、何か間違っているようです。しかし、私はそれが何であるかについての手がかりを持っていません。どんな助けでも大歓迎です!
リッチ
iphone - iOSでメインスレッドのランループとbgスレッドのランループで非同期ダウンロードをスケジュールしますか?
これは、WWDC 2010 セッション 208 のスライドです。
複数の conn を currentRunLoop に入れることに関連する問題はありますか?
バックグラウンド スレッドの実行ループで NSURLConnection をスケジュールすると、どのような利点がありますか?
ありがとうございました!
iphone - 複数の NSURLConnection と NSRunLoop
アプリケーションのダウンロード速度を上げようとしています。Asynchronous NSURLConnection を使用してサーバーからコンテンツをダウンロードしましたが、1 つの接続で正常に動作していました。
この投稿のコードを使用して、複数のデリゲート オブジェクトを実装します。Objective-C の複数の NSURLConnection デリゲート
2 つの NSURLConnection オブジェクトを作成したとき、それぞれが異なるファイルをダウンロードしようとしています。コールバック didReceiveData ルーチンが呼び出されましたが、最初の接続が完了するまで最初の NSURLConnection オブジェクトのデータのみを受信し、その後 2 番目の NSURLConnection からデータの受信を開始しました。これら 2 つの接続で同時にデータを受信したいのですが、どうすればよいですか? これが私の現在のコードです。
次に、デリゲート オブジェクトで、これらのルーチンを実装しました