問題タブ [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.
iphone - NSOperationQueue と ASIHTTPRequest
ASIHTTPRequestを中心に記述されたラッパー クラスのテスト ケースを作成しています。判断できない理由により、ASIHTTPRequestが完了する前にテスト ケースが失敗して完了します。
プログラムの流れは次のとおりです。
- 私のテストケースから始めます。
- httpエンジンオブジェクトを初期化し、新しいリストを作成するように指示します
- 新しい ASIHTTPRequest オブジェクトを作成してセットアップします。
- リクエストを操作キューに追加します。
- そのキューが空になるまで待ちます
- デリゲート メソッドが呼び出されたかどうかを確認し、呼び出されていない場合はテストに失敗します。
現在、ほとんどの場合、すべてが正常に機能し、テストに合格しますが、操作キューが待機メソッドに制御を返した後にデリゲート メソッドが呼び出されたため、失敗する場合もあります。
テストケース
エンジンコード
iphone - NSOperationQueueキューwaitUntilAllOperationsAreFinishedがハングします
私はiphoneアプリを持っており、View Controllerのロード時に、Webサービスを呼び出し、すべてのバックグラウンドスレッドでXMLを取得して解析したいと考えています。次に、スレッドの完了後にUIを更新し、別のスレッドを起動して、別のバックグラウンドスレッドで2番目の操作を実行します。
スレッド呼び出しを連鎖させるようなものです。
- UIスレッド->BGスレッドの作成
- BGスレッド->XMLサービスを呼び出して結果を取得する
- UIスレッド->BGスレッド操作の成功のUIを更新します
- BGスレッド->操作のパート2を発射します
すべてアプリのロード時に。
問題は、私の最初のBGスレッド操作が決して終了しないように見えることです。手順2が完了した後、何が起こっているかを確認するために電話を追加しましたがwaitUntilAllOperationsAreFinished
、アプリがそのポイントを超えることはありません。
これは一種の基本的なスケルトン実装です。
最初のスレッド呼び出しが決して終了しないように見える理由についてのアイデアはありますか?
あなたがマークを与えることができるどんな助けにも感謝します
cocoa - NSOperations がフェイルセーフな方法で確実に実行されるようにするにはどうすればよいですか?
私が欲しいもの
アプリケーションに NSOperationQueue があり、アプリケーションが終了する前にすべての操作が処理されることが重要です。終了する前に NSOperationQueue が空であることを確認するために、終了時に次のコードを取得しました。
終了する前に NSOperation が「フリーズ」し、キュー全体がブロックされる前に、コードで問題が発生しました。明らかに、このような状況では、私のコードは例外をスローする必要があり、現在は例外をスローしています。
しかし、操作が停止してキューをブロックし、アプリケーションが終了せず、障害が検出されないという奇妙な事態が発生するのを防ぐ必要があります。
私のごみの解決策
操作を終了するキューにタイムアウトを設定することを検討しています。その後、タイムアウトしたときに例外をスローして、問題をキャッチできます。
しかし、これは正しくありません。理想的には、作業が完了したことを確認するためにタイマーに依存したくありません。
私の質問
操作が停止していないことを確認する、フェイル セーフな方法はありますか?
iphone - 非同期 ASIHTTPRequest を開始する NSOperationQueue に NSOperation を追加する
そのため、バックグラウンド スレッドでデータをダウンロードするすべての REST 呼び出しを実行して、UI の応答性を維持しようとしています。
NSOperationQueue を含むビューコントローラーがあります。NSOperation のサブクラスであるインポーター クラスのインスタンスを作成します。インポーターの main() メソッド内で、ASIHTTPDataRequest を設定しています。リクエストを作成したら、リクエストを開始します。
問題: リクエストで「startAsynchronous」を呼び出してリクエストを開始すると、問題が発生しました。デリゲート コールバックが呼び出されることはありません。リクエストが開始され、そのデータがダウンロードされますが、デリゲート コールバック メソッドが呼び出されることはありません。
私の解決策:リクエストを同期的に開始すると、すべてが正常に機能するようです(つまり、コールバックなど)。これは正しい解決策ですか?
同期呼び出しが機能するのに、非同期呼び出しが機能しないのはなぜですか? Apple の「TopSongs」サンプルを参考にして、インポーター クラスをモデル化しています。
iphone - マルチメディアコンテンツを順番に再生する
こんにちは私は、映画や写真などのマルチメディアコンテンツをカプセル化するオブジェクトである「マルチメディアアクション」を多く含むNSArrayを持っています。それぞれが終了するのを待ってから、もう一方を呼び出す前に、順番に「再生」したいと思います。
次の操作を呼び出す前に、各操作の期間を管理するための最良の方法は何ですか?(写真の場合は数秒の遅延後に閉じるUIAlertViewを想像し、映画の場合は代わりにMPMoviePlayerControllerを想像してください)
NSOperationを使用して配列をスキャンするメソッドをすでに呼び出しています。
重要: NSOperation内で呼び出されたかどうかに関係なく、MPMovieControllerは再生されない(インターフェイスも表示されない)ようです。他の誰かがこの問題を経験しましたか?
UPDATEを使用performSelectorOnMainThread:
すると、MPMoviePlayerが期待どおりに機能します
objective-c - NSOperationのNSURLConnection
http接続からデータを読み取り、バイト配列に格納するコードを書いています。独自のNSOperationクラスを作成しました。コードの参照は
私のHttpWorkerクラス宣言は次のようなものです
そして私のHttpWorker.mクラスは次のようなものです
問題は、このコードを実行してhttpworkerオブジェクトをNSOperationQueueに追加すると、コードが正常に実行され、_connectionがnilではないが、デリゲートメソッドが実行されないことです。誰か助けてもらえますか?
よろしくお願いします...
objective-c - NSOperationQueueが単体テストで終了するまで待つにはどうすればよいですか?
問題
- NSOperationQueueという名前があります
logEntryGeneratorQueue
- キューのすべての操作が完了するまで待ちたい
私が使用する場合:
キューに追加するスレッドがバックグラウンド自体にある場合は、正常に機能します。
ただし、単体テストでこのコードを実行している場合は、メインスレッドで実行されます。それで私はこの「解決策」を思いつきました、それは私が本当に好きではありません:
これは常に理想的とは言えませんでしたが、10.5では常に正常に機能していました。ただし、プロジェクトを10.6 SDKを使用するようにアップグレードしたため、これが機能しなくなりました。
あるテストでは、テストが完了する前に実際にテストを終了しました。理由はわかりません。10.6ではNSOperationQueuesの動作が異なっていたのと関係があると思いますが、現在はGCDを使用しています。
私が試したこと
runUntilDateをsleepに置き換えてみました。これは、私が思ったように、すべてのテストがここに到達すると永久に一時停止することを意味します。
私の質問
NSOperationQueueがメインスレッドで終了するのを待つより良い方法はありますか?そうでない場合、どうすればこのコードを10.6で動作させることができますか?
iphone - NSOperationQueue と dealloc が呼び出されてアプリがクラッシュする問題
次のように、キューに NSOperation を作成しました。
これは正常に動作しますが、操作が完了する前にビューがポップされると、アプリは「EXC_BAD_ACCESS」でクラッシュします
cancelAllOperations を呼び出して操作キューをキャンセルしようとしましたが、既に処理中のため、アプリのクラッシュを防ぐことはできません。ドコは、操作が実行されている場合、操作がキャンセルされたことを検出して適切に応答するのは操作次第であると言っていますが、これをどのように実装するかはよくわかりません。
何か案は?
iphone - NSOperationを一時停止します
私はそれNSOperationQueue
にいくつかを持ってNSOperations
います(NSInvocationOperations
特に)。この操作は、いくつかの計算を実行し、それに応じて(もちろん、を介して)UI要素の状態を変更performSelectorOnMainThread:...
します。多くの場合、アニメーションを使用します。
私のUIには、UINavigationViewControllerと、別のビューに移動するためのいくつかのボタンがあります。そのため、計算/アニメーションの進行中に、ユーザーは現在のビューを離れることができます。そして、私が必要としているのは、ユーザーが現在のビューに戻るまで、これをなんとかして停止することです。
私が見つけた唯一の解決策は、スレッドセーフなブールフラグを作成し、それをすべてのスレッドでチェックすることです(while!flag sleep_for_some_time;など)。もっと良いものはありますか?