問題タブ [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.
pthreads - pthread によって作成された threadFunction 内で CFRunloop メカニズムを使用できる可能性はありますか?
なぜかNSThreadが使えません。しかし、2 つのスレッド間で CFRunloopSource を使用した通信方法は便利だと思います。では、pthread によって作成されたスレッド コンテキスト内で現在の cfrunloop 参照を取得できるのだろうか?
私はオンラインでつかみ、実際に pthread を使用しても runloop ref がまだ利用可能であるというコメントを見ました。しかし、私はドキュメントからこれについて何も見ませんでした。そこで、経験者の方にお聞きしたいです。
さらに、CFRetain(CFRunLoopGetCurrent()) によって新しいスレッドから取得した CFRunloopRef を、新しいスレッドと現在のスレッドの間で共有できますか? CFRunLoopWakeUp(ref) によって新しく作成されたスレッドで runloop をトリガーするときに ref が必要になるため
ありがとう、
ジャック・セラフ
objective-c - NSURLConnection が iPad のメモリを台無しにする
Web サービスから一連のデータと PDF ドキュメントをダウンロードする iPad アプリを作成します (データが最初にあり、ドキュメントはバックグラウンドで後でダウンロードされます)。そのために、HTTP(S) リクエスト経由で SOAP を使用します。それは正常に動作し、全体として、アプリは正常に動作しています。問題は、ある時点でダウンロードするドキュメントが多すぎると、アプリがクラッシュすることです。Instruments を使用して、特に NSRegularExpression と NSRunLoop のメモリの問題であることがわかりました。(私はARCを使用しています)
コードを改善して、NSRegularExpression の作成を最適化できました。しかし、NSRunLoop の問題を改善する方法がわかりません。
非同期と同期の両方の HTTP リクエストを試しました。非同期を使用して、ダウンロードが完了するまで待つ必要がありました。sleep()/[NSThread sleepForTimeInterval:] はオプションではないため、使用します
同期要求を使用して、Instruments は次のことを明らかにします。
また、NSRunLoop の助けを借りて「待機」し、メモリを台無しにします。
これは CoreFoundation または ARC のバグですか?
リクエストが完了するのを待っている間にアイドル状態にする別の方法はありますか?
前もって感謝します。
編集:
「メモリの問題」とは、アプリがメモリを使いすぎてクラッシュする (または iOS によって強制終了される) ことを意味します。
これは Instruments が示すもの
です。アプリのダウンロード時間が長くなるほど、パーセンテージが高くなります。
編集:
さらに下に行くと、メモリを台無しにしているのは NSURLConnection であることが明らかになりました。connection
どうやらとreceivedData
toの設定を忘れているようですnil
( URL Loading System Programming Guideを参照)。これにより、メモリ使用量が少し改善されました。
ここで、さらに 2 つの大きなメモリ割り当て操作があります。
これは、Instruments が表示するものに属していると思われるコードです。
コードを改善するために変更できることはありますか?
編集:(「NSRunLoopがiPadのメモリを台無しにする」からタイトルを変更)
編集: メモリを台無しにするのはNSURLConnectionであることを証明するテストアプリを作成しました。次に、Apple Developer Support に連絡しました。
NSURLConnection を使用した繰り返しで大量の PDF をダウンロードしているため、解決策は、@autoreleasepool { .. }
繰り返しに を追加し、NSRunLoop
.
ありがとう。
ios - メインスレッドで -[NSRunLoop runMode:beforeDate:] を呼び出すと、キューに入れられた NSOperations がメインスレッドで実行されます
今日、アプリが時間内に起動しないという問題に遭遇しました。私が使用していたサードパーティのコードが、以下のトリックを使用してユーザー エージェント文字列を取得しようとしていたことが判明しました。
( http://blog.sallarp.com/iphone-ipad-get-user-agent-for-uiwebview/#more-1003より)
そのコードを呼び出す前に、いくつかの操作を +[NSOperationQueue mainQueue] によって返されるキューに追加してキューに入れました。これらの操作は、+[NSData dataWithContentsOfURL:] を呼び出すときにバックグラウンドで実行されることを意図しています。
実行ループのメソッドが呼び出されると、キューに入れられた操作が実行され、メイン スレッドがブロックされ、アプリの起動が妨げられます。現在、サードパーティのコードが実行されるまで操作をキューに入れないようにすることで回避策を得ていますが、これがなぜ起こっているのか、そして将来それを防ぐ方法を誰かが知っているなら、ぜひ聞いてみたいです. ありがとう!
input - アプリケーションのメイン実行ループと入力処理がCPU時間を消費しないのはなぜですか?
Macアプリケーション( NSRunLoop )に適用される実行ループをよりよく理解しようとしていますが、これはより一般的な質問になる可能性もあります。NSRunLoopのドキュメントには次のように書かれています。
...コードは、実行ループを駆動する
while
orループを提供します。for
ループ内で、run loopオブジェクトを使用して、イベントを受信し、インストールされたハンドラーを呼び出すイベント処理コードを「実行」します。
ドキュメントには、次のようなコード例があります。
したがって、コードは、終了する必要があると判断されるまで、実行ループを呼び出し続けます。メソッド「-runMode:beforeDate:
ループを1回実行し、指定された日付まで指定されたモードでの入力をブロックします。」また、-run
「レシーバーを永続的なループに入れ、その間に接続されているすべての入力ソースからのデータを処理する」方法もあります。
実行ループを繰り返し呼び出す(または-run
、これ自体がそう思われる)呼び出しがCPUを消費しないようにするにはどうすればよいですか?Cocoaアプリケーションは、メインの実行ループが実行されている間、バックグラウンドでアイドル状態になり、CPU時間をゼロ(またはほぼゼロ)消費します。
そして、内-runMode:beforeDate:
で、CPUをポーリングして消費することなく、入力が受信されるかタイマーが起動するまで、実行ループをどのようにブロックできますか?
ios - iOSで正確なタイマーを取得する方法
タイマーが必要なアプリをやっています。私は試しNSTimer
ましたが、NSTimer
常に負けたり遅れたりします。時間を正確に記録できる iOS SDK のクラスはありますか。20ms から 40ms の精度で問題ありません。一定の時間間隔で画像を変更できるようにしたいと思います。
iphone - iOS: 同じビューを使用する複数の NSTimer インスタンス - マルチスレッドを使用する必要がありますか?
私はマルチビューアプリに取り組んでいます。ビューの 1 つはテーブル ビューです。各セルにはストップウォッチがあります。ストップウォッチには NSTimer を使用する予定です。ユーザーがビューを切り替えて後で戻ってきた場合でも、タイマーが正しく機能するようにマルチスレッドを実装する必要がありますか? 私は調査を行いましたが、チュートリアルのほとんどは単一のビューで 1 つの NSTimer をカバーしています。タイマーの実行中に、インターフェイスやナビゲーションなどを使用するなど、ユーザーが他のことを実行できるようにしたいと考えています。私の場合、タイマーごとに1つのランループが必要ですか? それはお勧めですか?パフォーマンス上の欠点はありますか?
どうもありがとう!
iphone - 関数 sleep() と [[NSRunLoop currentRunLoop] runUntilDate] の使い方の違い
次のコードを検討してください。
最初のものでは、アニメーションを作成する関数を呼び出します。私は特定の時間間隔でそれを行います:
2番目のものでは、アニメーションを作成します
3 つ目は、すべてが正常に行われているかどうかを確認するために使用するデリゲート メソッドです。
したがって、使用すると問題なく機能NSRunLoop
し、デリゲート メソッドが呼び出されますが、関数で使用しようとするとsleep(3)
、デリゲート メソッドが呼び出されません。
私の質問:
1) NSRunLoop と sleep() の違いを教えてください。sleep() が使用されているときにデリゲート メソッドが呼び出されないのはなぜですか?
2) より使いやすい第 3 の方法があるのではないでしょうか?
iphone - 別のスレッド内で NSRunLoop を動作させる方法は?
このコードを見てください:
function
メソッドが呼び出されますが、20 秒間の一時停止はありません。NSRunLoop
切り離されたスレッドで作業するにはどうすればよいですか?
objective-c - シミュレーターで NSRunLoop が正常に動作し、iDevice がクラッシュする
秒ごとに更新する必要がある iOS アプリ (FW: 5.0+ & ARC) に取り組んでいます。
現在、私はこれをメソッド内に持っています(-ViewDidLoadのときにperformSelectorで呼び出されます):
変数はcounter
ヘッダーで NSTimer として呼び出されます。[counter fire]
1 秒後ではなく、ビューが読み込まれるとすぐに呼び出されるように、明示的に呼び出します。
これは iOS シミュレーターでは問題なく動作し、毎秒起動しますが、iDevice に移動するとクラッシュします。
この行をコメントアウトしましたがNSRunLoop
、iDevice はクラッシュしません。ただし、毎秒更新されなくなりました。
ここで何が間違っていますか?
ios - NSTimerでrunloopに追加する必要があります
メインキューにディスパッチしてリピートを作成する理由を誰かが説明できるかどうか疑問に思ってNSTimer
います。使用しているときでもperformselectorOnMainThread
、それを起動させるためにRUNLOOPに追加する必要があります。
以下は私の質問の例です:
編集:
私はこの質問の言い回しが非常に貧弱だと思います。と呼んだらなぜ [[NSRunLoop currentRunLoop] addTimer:_busTimer forMode:NSRunLoopCommonModes];
必要なのか知りたいのですが。その行を含めないと、タイマーは起動しません。startTimer
someMethodBeginCalled
たとえば、startTimer
から電話をかけると、回線を削除でき、タイマーは60秒ごとに起動します。viewDidLoad
NSRunLoop