問題タブ [nsoperation]

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.

0 投票する
1 に答える
270 参照

objective-c - 内部接続による操作のキャンセル

NSURLConnectionを使用してデータをダウンロードするNSOperationがありますが、次のようになります。

問題は、接続がハングすることがあり、他のソースが起動していないため、ループが永久に実行され続け、操作をキャンセルする機会がないことです。私の操作キューには1つの操作の制限があるため、すべてがほとんど行き詰まっています。

問題は、この問題に対する最善の解決策は何かということです。

  1. distantFutureの代わりに、0.5秒などの短い時間を使用します。(おそらく余分なCPUサイクルを食べるでしょう)
  2. 実行中のスレッドへの参照をivarに保存し、operartionのcancelメソッドのスレッドでperformselectorを介して実行ループをくすぐるようにしてください。(すでに終了していて実行されなくなる実行ループでセレクターをキューに入れると、状況が発生する可能性があります。これにより、私が知る限り、リークが発生します)

または多分別の方法がありますか?

0 投票する
3 に答える
1682 参照

iphone - Core Dataで適切にマルチスレッド化する方法は?

スレッド化されたNSOperationでいくつかのコアデータ操作を実行しようとすると、多くの問題が発生します。

現在、スレッド化されたNSOperationsで純粋に使用される管理対象オブジェクトコンテキストをアプリデリゲートに作成しました。最大同時実行数が1のNSOperationQueueをセットアップして、各アクションがシリアルに実行されるようにします。操作(インターネットからデータを取得して新しい管理対象オブジェクトを作成する)ごとに、使用するコンテキストを渡します。新しいオブジェクトが作成されたら、次に使用する操作のためにコンテキストを保存してリセットします。ただし、これを実行しているときに断続的にmallocエラーが発生し、それを理解するために何日も費やしました。これは、スレッド化の方法と関係があるように見えます。

私が得ているエラーは、この関連するスタックオーバーフローの質問で見ることができます。

管理対象オブジェクトのプロパティをオブジェクトに設定しているだけで、mallocエラーが発生していNSNumberます。また、そのプロパティを設定するのは初めてなので、自分自身を解放しすぎているわけではありません。私はそれをまったく理解できず、GuardMallocを使用してエラーを再現することはできません、それは発生しません!トリガーされている他の場所でエラーが発生しているようですが、どこで発生しているのかわかりません。

私が推測できるのは、エラーがどういうわけか私がすべてを設定した方法に関連しているということです。に操作を追加するのではなく、自分で操作を実行しようとしましたが、NSOperationQueue正常に動作しているように見えます(ただし、メインスレッドがハングします!)。

また、保存が行われたときにアプリ内の他のコンテキストに通知するためのコンテキストも必要なので、通知を確認しNSManagedObjectContextDidSaveNotificationます。ただし、保存はNSOperation(他のスレッド)で実行されているため、通知は実行中のスレッドでのみディスパッチされるため、これに問題がありますか?

0 投票する
1 に答える
1021 参照

iphone - initWithContentsOfURL は、NSOperation サブクラス内でメモリ リークを起こします。他の誰かがこれを見ていますか?

私は不可解なメモリリークを見つめながら、ここ数時間Instrumentsに住んでいます。私が書いた NSOperation サブクラスのこの 1 行のコードにそれを分離しました。

これにより、定期的に 3500 バイトがリークされます。他の誰かがこれを見ていますか?もしそうなら、回避策はありますか?

前もって感謝します。

アップデート:

これは、私の NSOperation サブクラスの main() 本体内のコードの関連セクションです。

ご覧のとおり、sequenceData と sequenceString は適切に解放されています。また、このサブクラスのすべての ivar (染色体など) が適切にメモリ管理されていることを確認しました。

-ダグ

0 投票する
3 に答える
7649 参照

iphone - NSOperationQueue 操作がキャンセルされるのを待っている間、メイン スレッドが無期限にハングする [デバイス上のみ!]

いつでもキャンセルできるようにしたい一連の NSOperations (最大同時実行数を 1 に設定) を実行しているメイン スレッドに NSOperationQueue があります。ボタンを押すと、すべての操作をキャンセルして終了するまで待つようにキューに指示します。これにより、操作キューが空になるまでメインスレッドがハングするはずですが、メインスレッドが無期限にハングします。

これを停止するために使用するコードは次のとおりです。

注:waitUntilAllOperationsAreFinished以降のプロセスではキューを空にする必要があるため、使用する必要があります。

奇妙なことに、これはデバイス上でのみ発生しています。シミュレーターで実行すると、期待どおりに動作します。

ブレークポイントを監視しており、現在実行中の操作が完了するまで追跡できます。[self isCancelled] を検出し、実行中の処理を停止して、mainメソッドの最後までスキップします。操作でハングする原因が何もないことがわかります。すべての操作をキャンセルすると、他の操作は開始されず、キューは終了するはずです。ブレークポイントを追加して確認しましたが、他の操作は開始されません。

なぜこうなった?

0 投票する
4 に答える
18402 参照

iphone - メインスレッドのNSOperationとNSNotificationCenter

NSOperationがあります。終了したら、NSNotificationCenterを起動して、NSoperationが終了したことをプログラムに通知し、GUIを更新します。

私の理解では、NSOperationはメインスレッド上にないため、NSNotificationのリスナーはメインスレッド上で実行されません。

イベントを起動したときにリスナーがメインスレッドで実行されるようにするにはどうすればよいですか?

0 投票する
1 に答える
3687 参照

iphone - スレッドでの NSAssert の使用

NSAssert予期しない状況が発生した場合、アプリケーションがすぐに失敗してクラッシュ ログに意味のあるメッセージが表示されるように、iPhone アプリ全体で使用しようとしています。

これは、失敗NSAssertがメインスレッドにある場合、NSInternalInconsistencyExceptionデフォルトで発生し、キャッチされずに実行を停止するため、正常に機能します。しかし、私はバックグラウンド スレッドでも処理を行っています。この場合、NSAssertスレッドは中止されますが、プログラミングは実行され続けます。

私の現在の解決策は、メイン スレッド (この場合はNSOperationmainメソッド) で例外をキャッチして再スローすることです。

より良い方法はありますか?おそらくカスタム NSAssertionHandler を使用していますか?

assert私は、静的注釈でC を使用できることを知っています。

しかし、これでは の実際の失敗値が何であるかを示すことはできませんx

0 投票する
1 に答える
1171 参照

iphone - NSOperationQueue で開始されたスレッドからのコールバックを最適化する方法

このことを考慮:

英語で:

メインスレッドでビューコントローラーを実行し、子モデルオブジェクトを使用して何かを実行します(ネットワーク経由でデータをフェッチします)。ビュー コントローラーは子のデリゲートであるため、子はデリゲートによって結果を通知できます。コストのかかる作業を実行するために、バックグラウンド スレッドで操作を起動する NSInvocationOperation を使用して child.doSomething メソッドを生成します。完了すると、子はデリゲート (ビュー コントローラー) の callbackA または callbackB を呼び出して結果を返します。これらのコールバックは、doSomething 呼び出しが実行されたのと同じバックグラウンド スレッドで呼び出されるため (私が思うに)、私は performSelectorOnMainThread を呼び出して制御をメイン スレッドに戻す必要があります。

これは問題なく動作しますが、コールバックごとに 2 つのコールバック関連のメソッドを用意するのは好きではありません。(実際にはより多くのコールバックがあるため、実際のコードはさらに肥大化しています。) 理想的には、次のようにします。

質問:

1) 「not_running_on_main_thread」テストを行うにはどうすればよいですか?

2) コールバックの肥大化を抑える他の方法はありますか?

編集:わかりました、投稿する前にNSThreadドキュメントを読んだことはありません:) [NSThread isMainThread]が探しているもののようです。しかし、これを再構築またはより良くする他の方法はありますか?

0 投票する
2 に答える
3623 参照

ios - NSOperation は UI ペイントをブロックしますか?

NSOperationの使用と描画に関するアドバイスを求めています。

メインスレッドにサブクラスを作成させ、NSOperationサブクラスに追加しますNSOperationQueue

NSOperationはいくつかの重い処理を行います.main()メソッドで数分間ループし、常にいくつかの作業を処理することを目的としていますが、今のところ、内部にsleep(1)を含むwhile()ループがあり、移動するように設定されています.約5回(テスト用)。

これを生成するメイン (元の) スレッドNSOperationは、ビューへの描画と UI の更新を担当します。

NSOperation スレッドに通知を使用して、メイン スレッドにある程度の処理が完了したことを伝えるつもりでしたが、現時点では、この通知は while() ループを通過するたびに 1 回 (つまり、1 秒に 1 回) 送信されます。 sleep(1) を実行しているだけです)。メイン スレッド (ビュー) は、これらの通知を受け取るように登録します。

通知はすぐにメイン スレッドに到達し、非同期のように見えますが、問題ないように見えます。両方のスレッドが期待どおりに実行されているようです...つまり、同時に実行されます。(各スレッドがいつ通知を送受信するかを大まかに確認するために NSLog() を使用します)。

ビューが通知を受け取り、そのハンドラー メソッドが呼び出されると、単純に整数変数をインクリメントし、これを (もちろん文字列として) ビューに描画しようとします。テストでは、drawRect: のコードは、この整数を (文字列として) 画面にうまく描画します。

ただし、ここに私の問題があります (申し訳ありませんが、ここに到達するまでに少し時間がかかりました): メインスレッド (ビュー) が NSOperation から通知を受け取ると、このテスト整数を更新し、[self setNeedsDisplay] を呼び出します。ただし、ビューは NSOperation が終了するまで再描画されません! 別のスレッドである NSOperation には、メイン スレッドのイベント ループをブロックする機能がないことを期待していましたが、これが起こっているようです。NSOperation が終了し、その main() が戻ると、ビューは最終的にすぐに再描画されます。

おそらく私はNSOperation正しく使用していません。「非並行」モードで使用していますが、名前にもかかわらず、これでも新しいスレッドが生成され、非同期処理が可能になると理解しています。

コードを見たい場合は、私に知らせてください。

0 投票する
2 に答える
1908 参照

iphone - データの解析中にUIを描画するためのNSOperation?

皆さんが私を助けてくれることを願っています:)

メイン スレッドで NSOperation を作成し、それをキューに追加します。その操作は、NSURLConnection を使用してデータ サーバーに接続し、receivedData を保存して解析することです。

Operation.m

次に、この NSURL デリゲート メソッドで、サーバーから受け取ったばかりのデータを解析します。

Operation.m

データには、たとえば、到着時に描画するためにメイン スレッドに送信する screenItem、CellItem、TextItem などの項目があります。(itemTable が届いたら UITableView を作成し、itemWeb が届いたら UIWebView を作成します)

これを使用して、アイテムをメインスレッドに送信します。

Operation.m

次に、通知レシーバーで:

AppDelegate.m

私の問題は、NSOperation が終了するまで UI が描画されないことです。別のスレッドである NSOpertion はメイン スレッドをブロックしないと思いましたが、それが起こっていることだと思います。

この問題のヒントはありますか?

読んでくれてありがとう!

0 投票する
1 に答える
342 参照

cocoa - ASIHTTPRequest が同期モードで NSOperation 変数を飲み込む

ねえ、私はしばらくこの問題と戦ってきました。おそらく、マルチスレッドに関する知識に欠けているものがありますが、ここで何が起こりますか。nsoperation キューを作成すると、割り当てられた変数は "[request startSynchronous];" の後にクリアされます。コード行。これが私が話していることです:

オブジェクトはまだここに存在します

[リクエスト startSynchronous];

するとここで物体が消えます!

これは原則的な理解のギャップと関係があると確信していますが、何日もコードを再配置して成功していません。

...