問題タブ [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.
ios - iOS UIScrollView がスタックし、NSRunLoopCommonModes で応答しなくなる
私の iPhone アプリでは、WebSockets ネットワーク用にサード パーティのライブラリ (libPusher) を使用しています。このライブラリが原因で、アプリ内のすべての UIScrollView コンポーネントが応答しなくなります。これには、UIScrollViews と UITableView が含まれます。
ユーザーがUIScrollViewコンポーネントの1つを指でスクロールし、ネットワーク操作が進行中のときにたまたま指でビューに触れてスライドし続けると、UIScrollViewが完全に応答しなくなり、停止します。タッチイベントを受け付けず(指を離しても常にドラッグモードとみなす)、適切に減速しません。唯一の解決策は、UIScrollView を破棄して、新しいものを再作成することです。
ライブラリの開発者に連絡しましたが、残念ながら今のところ返事がありません。
私が読んだところによると、これは実行ループを などの不適切なモードで実行する場合によくある問題ですが、NSDefaultRunLoopMode
このライブラリは正しいことをしているようで、実行ループを実行しているNSRunLoopCommonModes
ため、正解は。
いろいろなモードで遊んでみました(試してみましNSDefaultRunLoopMode
た)が、動作は同じです。
私は iOS 5 を使用していますが、シミュレーターでもデバイスでも同じ動作です。
ライブラリに問題があると思われるコードを貼り付けさせてください。解決策を見つけるのに十分な範囲であることを願っています。
NSOperation のサブクラスには次のものがあります。
のように、この操作はメインスレッドで実行され[[NSOperationQueue mainQueue] addOperation:authOperation];
ます。(これが問題かもしれませんが、別のスレッドで実行しようとしたところクラッシュしたため、ライブラリをバックグラウンド スレッド セーフにするためにさらに作業が必要になるため、これが解決策であることをまだ証明できません...)
これまで試した
- 実行ループモードを
NSDefaultRunLoopMode
- に変更しても役に立ちませんでした。 - 私が作成した新しい操作キューで操作を実行します (たとえば、メイン スレッドではありません) が、ライブラリがクラッシュするため、これに対する準備ができていないようです。
私はまだ暗闇の中で撮影しているように感じます...助けて:)
ありがとう!
iphone - バックグラウンド スレッドでのアニメーションの実行を停止し、ループを実行します
UITableViewCell でアニメーションを実行します。各セルには独自のアニメーションがあり、セルは再利用可能です。私が使う[mView performSelectorInBackground:@selector(layoutSubview) withObject:nil];
バックグラウンド スレッドで runLoop を開始して、次のようなタスクを実行します。
そしてそれを止めます:
テーブルを高速スクロールすると問題が発生します。これは、最初のセルの開始時にアニメーションを開始するため、最初の runLoop 呼び出しが発生して setNeedDisplay とそこからすべてのメソッドが実行されるためです。しかし、最初の runLoop サイクルが終了する前に、セルはビューから消え、すでに再利用可能になっています。それで、サイクルがまだ操作を実行している間に、それをクリアし始めます。ここで、次のような状況に遭遇します
割り当て解除されたインスタンスに送信されたメッセージ
そのスレッドでの操作の実行を正しく停止するにはどうすればよいか、ヒントを教えてください。たとえば、いくつかのアクションを実行しているオブジェクトを実現したい場合、すぐに停止する方法はありますか?
十分な情報を提供したことを願っています。ありがとう
更新:まったくアイデアがありませんか?
macos - CFRunLoopRun()と[NSRunLoop実行]
NSRunLoopオブジェクトがあり、それにタイマーとストリームをアタッチします。それは素晴らしい働きをします。それをやめることは、まったく別の話です。
を使用してループを実行します[runLoop run]
。
を使用してループを停止しようとするとCRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop])
、ループが停止しません。CRunLoopRun()
代わりにを使用してループを開始すると、機能します。また、呼び出しが正しいスレッド(カスタム実行ループを実行しているスレッド)で行われることを確認しました。私はこれをでデバッグしましたpthread_self()
。
メーリングリストのアーカイブを見つけました。開発者は、「CRunLoopStop()
のrunメソッドを使用してループを開始した場合は、わざわざ使用しないでください」と言っていますNSRunLoop
。なぜそうなのか理解できます。通常、同じ関数セットのイニシャライザーとファイナライザーをペアにします。
NSRunLoop
「CFに頼る」ことなく、どうやってやめますか?stop
にメソッドが表示されませんNSRunLoop
。ドキュメントには、3つの方法で実行ループを停止できると書かれています。
- タイムアウト値で実行するように実行ループを構成します
- 実行ループに使用を停止するように指示します
CFRunLoopStop()
- すべての入力ソースを削除しますが、これは実行ループを停止するための信頼性の低い方法です。これは、背後の実行ループに何が詰まっているのかがわからないためです。
さて、私はすでに2を試しましたが、CFを掘り下げる必要があるため、「醜い」感じがします。3.問題外です-非決定論的なコードは好きではありません。
これにより、1が残ります。ドキュメントを正しく理解している場合、既存の実行ループにタイムアウトを「追加」することはできません。新しい実行ループは、タイムアウト付きでのみ実行できます。新しい実行ループを実行しても、ネストされた実行ループしか作成されないため、問題は解決しません。私はまだ古いものにすぐに戻ります、私が止めたかったのと同じです...そうですか?これを誤解したかもしれません。また、タイムアウト値を使用してループを実行したくありません。その場合、CPUサイクルの書き込み(タイムアウト値が低い)と応答性(タイムアウト値が高い)の間でトレードオフを行う必要があります。
これは私が今持っているセットアップです(擬似コードっぽい):
Communicator.h
Communicator.m
どうしようかな?CFをいじるのは一般的/良いパターンですか?私は財団を十分に知りません。CF層への干渉はおそらく危険ですか(メモリの破損、不整合、メモリリークに関して)?私が達成しようとしていることを達成するためのより良いパターンはありますか?
iphone - NSRunLoop の使用
私はviewDidLoadで2つのメソッドを実行しており、それらの間で10秒間NSRunLoopを実行しています
ここで画像は変化せず、黒い画面になり、10 秒後には [恐怖] の結果しか表示されません。反対に、viewDidLoad に [nextImage] のみを保持すると、画像が変更され、NSRunLoop で何か問題が発生していると思います
iphone - NSRunLoop と NSAutoreleasePool はどのように相互作用しますか?
autorelease プールは、実行ループの最後に解放されます。
それはループの反復の終わりを意味しますか? これはいつ起こりますか?
すべてのタッチ、モーション、またはリモート コントロール イベントが処理されると、プールは排出されます。
アプリケーションがタッチを提供しない場合はどうなりますか?
このようなコードを使用する場合、 と の間でオブジェクトが解放されていないことをどのように確認でき
[self someObject]
ますretain
かsomeMethod
?
ios5 - RunLoop の CADisplayLink がコールバックを呼び出していない
drawFrame をすべてのフレームで呼び出す必要がある次のコードがありますが、そうではありません。
dispayLink は CADisplayLink へのポインタです。それらは私のビューのラベルに接続されています。このビューは、viewReference に接続されています。self は ViewController です。drawFrame が宣言されている
l.text は、viewDidLoad でテストするときに設定できます。
drawFrame が呼び出されないようです。このアプリケーションは、カスタム ストーリーボード ファイルを含む Xcode 4.2 の空のアプリケーション テンプレートに基づいています (作成時にストーリーボードの使用を選択するのではなく、後で追加しました)。ビューコントローラー、ビュー、ラベル以外は空です。
私はこれが初めてです。[[NSRunLoop currentRunLoop] run] を呼び出すと、iOS 5.0 シミュレーターにアプリがまったく表示されません。いずれにせよ、 currentRunLoop はデフォルトのメイン runLoop である必要があります。
ios - iOS: アプリが非アクティブ状態になった場合、保留中の遅延実行セレクター要求はどうなりますか?
私の推測では、afterDelay 値 > 0.0 で開始され、アプリがバックグラウンドに入ったときに残り時間があったセレクターを実行すると、バックグラウンドでは実行されませんが、アプリがバックグラウンドから抜け出した後、クロックがダウンして再開されます。モード。
しかし、私の勘は正しいですか?
ios - どうすればスレッドを停止できますか
connectionDidFinishLoading時にスレッドが開始するアプリケーションを開発しています。
connectionDidFinishLoadingが複数回呼び出されるので、ダウンロードスレッドを停止してから、もう一度開始します。最後のスレッドのみを実行しようとしています。途中でスレッドを停止するのを手伝ってください。
cocoa - Cocoaのイベント駆動型システム:バックグラウンドタスクはどこで実行されますか?
Mac OS Xでは、Cocoaはイベント駆動型です。これは、それぞれがUIによって駆動されることを意味します。ユーザーが何かをクリックしたり、特定の領域を移動したりすると、イベントハンドラーが呼び出されます。MainはNSApplicationMain()を呼び出すだけで、プログラムが終了するまで無限ループを作成します。
ただし、ユーザー主導ではないタスクについてはどうでしょうか。プログラムの基本機能を提供するために、バックグラウンドで動作する必要のあるタスクをどこに配置しますか?たとえば、フォトブースは、ユーザーがUIを操作するときに特定のことを行います(つまり、ユーザーが特定のボタンをクリックするとビデオカメラに変わります)。ただし、フォトブースは、ビデオストリームを提供するために、カメラからフレームを継続的に取得しています。
だから私の質問は、UI以外のタスクのコードはどこに行くのですか?Main()は、プログラムが開始されたばかりのときではなく、プログラムの存続期間全体にわたって実行するタスクが必要なため、実際には可能ではありません。
私はMacOSX Snow Leopard(つまり、すべてのMacシステムで動作するものが必要です:Lion OS X)を使用しており、XcodeでObj-CCocoaアプリケーションを使用しています。
cocoa-touch - `cancelPerformSelectorsWithTarget:` vs `cancelPreviousPerformRequestsWithTarget:`
「ティック」間の間隔がこれまでになく短いシミュレーションを構築しています。
シミュレーション画面を出るときにシミュレーションを止めたいので、
初めて使ってみた
…しかし、これはうまくいきませんでした。
なぜだめですか?
どうやら同じ問題と同じ解決策を持っていた他の多くの人がいます。 しかし、正確な理由はどこにも見つかりませんでした。2つの違いは何ですか?