問題タブ [nsoperationqueue]
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、メモリ、および GCD。適切に実装するには?
ドキュメントで答えが見つからないことについてNSOperation
、いくつかの単純な疑問があります。GCD
最初の質問は、メモリ管理に関連しています。
NSOperationQueue に追加するメソッド用の Autorealease プールを作成する必要があるかどうかを知りたいです。NSOperations を使用せずに別のスレッドでメソッドを実行する場合と同様です。
次の質問はNSOperation
、 が GCD を処理するのか、それとも手動で行う必要があるのかということです。
ご協力ありがとうございました!
uiimage - iOS の同時画像読み込み
iOS 用の RSS リーダー アプリを作成しています。フィード内の記事のリストを含む tableView があります。その tableView の各セルには、画像 (記事のサムネイル) が含まれます。最も効果的な方法でロードしたい:
- 最も優先度が高いのは、表示されているサムネイルです。
- 表示されているサムネイルが適切な順序 (上から下) で読み込まれるとよいでしょう。
- 非表示のサムネイルもプリロードする必要があります。ただし優先度は最低。
- 非表示のサムネイルの読み込み順序が次のようになるとよいでしょう: 最も近い (上と下の両方から) 表示されているセルから最も遠いセルへ。
- tableView がスクロールするたびに、セルは可視性と可視領域までの距離に基づいて読み込みの優先度を更新する必要があります。
私はどのアプローチを使用するかについて少し立ち往生しています。一番難しいのは(5)です。アプリは狭い帯域幅の条件で使用される可能性が高いため、必要です。そのため、アプリは低速の接続速度を最大限に活用する必要があります。
今のところ、画像の読み込み用に NSOperationQueue があります。maxConcurrentOperationCount は 2 です。読み込み中の NSOperations は (Apple の用語では) 非並行です。つまり、別々のスレッドで実行されます。各 NSOperation は、単なる同期 NSData の initWithContentsOfURL です。このアプローチの問題は、すでに実行中の読み込み操作を制御できないことです。それらをイベントキャンセルすることはできません!
いつでもすべての(すでに実行中を含む)ロード操作の優先度を変更できれば理想的です。そこで、非同期の NSURLConnection をロードする同時 (Apple の用語で) NSOperations に切り替えることを考えています。didReceiveData の間の isCancelled prop を見て、操作をキャンセルできるようにします。優先度が下げられた操作のキャンセルを使用する予定です。操作によって既に読み込まれたデータを保存し、キャンセルし、新しい (より低い) 優先度でキューに追加して、ダウンロードを再開します。ロード タスクは CPU を集中的に使用せず、遅延が大きくなる可能性が高いため、同時 (Apple の用語で) 操作によって UI が遅くならないことを願っています。
また、操作の優先順位をどうするかがわかりません。NSOperationQueuePriority には可能な値が 5 つしかないためです。つまり、見える (上から下へ) サムネイルと見えない (近くから遠くへ) サムネイルをロードする順序を維持する方法は?
お知らせ下さい)
iphone - iPhoneapでNSOperationQueueを使用する際に求められるアドバイス
iPhoneアプリは通常、アプリデリゲートに保存されている共有NSOperationQueueを1つだけ使用し、必要に応じて各コントローラーにNSOperationsを配置させる必要がありますか、それとも各コントローラーに独自のNSOperationQueueを設定しても問題ありませんか?どちらのアプローチも受け入れられますか?
objective-c - OperationQueue を介した UIImageView の読み込みに関する問題
NSOperationQueue を使用して UIImageView をロードします。
ロードは、インターネットから画像をフェッチし、それを画像ビューに追加します。私が抱えている問題は、メソッドが終了することですが、画像ビューが実際に画像を表示するか、スーパービューから画像ビューを削除するのに約3秒かかります...
NSLOG は、最初の 2 つのログ ステートメント間の遅延が約 3 秒であることを示していますが、その理由を理解できません....
最新のコードで更新......
objective-c - NSOperationQueue 内の複数の NSOperation インスタンスの NSUrlConnection
次のコードは、NSOperationQueue に複数の NSOperation インスタンスを追加します。Operation は URL のコンテンツを取得するだけです。私もphpコードを提供しています...
次のコードを考えると...
test.php witch -requestResponse 呼び出しの内容:
問題は[NSThread sleepForTimeInterval:1.0]
、キューに NSOperation を追加する前に遅延を作成するために使用すると、すべての要求が完了するまでにほぼ同じ時間がかかることです。この行にコメントすると、ほとんどのリクエストが完了するまでにかなりの時間がかかります。問題はなぜですか?
コマンドラインから(curlを使用して)URLをテストしましたが、phpへの同時呼び出しの数に関係なく、要求が完了するまでに同じ時間がかかるため、問題はサーバー側ではありません。
これは、 sleepForTimeInterval が無効になっているサーバーとして localhost を使用した出力です。
// もちろん、PHP が実際の作業を行っている場合、違いははるかに大きくなります (7 秒から 20 秒まで!)。
およびsleepForTimeInterval が有効になっている
iphone - NSOperationQueue 内の ASIFormDataRequest の遅延、キャンセル、または置換 (検索ボックス用)
以下のコードを使用して ASIFormDataRequest を正常に作成しています。
現在、このリクエストは、ユーザーが検索ボックスでキーを押すたびに行われます (入力されたテキストは、検索文字列としてリクエストで送信されます)。ただし、キーを押すたびにリクエストを送信するのではなく、リクエストが送信される前にユーザーが検索ボックスにさらに文字を入力できるように、リクエストを 1 秒遅らせたいと考えています。
ユーザーが入力を続ける間、1 秒間待機するスレッドの作成に成功しました (確かに、これが最善の方法であるとはまだ確信していませんが、今のところは機能します)...
これ
これを呼び出します
しかし、ユーザーが入力を続けた場合、リクエストをキャンセルする方法、リクエストをキューに入れないようにする方法、またはキューを空にして新しいリクエストに置き換える方法を見つけることができませんでした。
最後に、ユーザーがポップアップ キーボードの [検索] ボタンを押すまで待つように強制することもできますが、それなしで検索結果を提供したいと考えていました。
ありがとう
iphone - デリゲートメソッドが呼び出されていない
画像を非同期でダウンロードするためのオープンソース(github)ヘルパークラスを作成しています(大きな問題がありました)。
ただし、画像のダウンロードが終了したことをデリゲートに警告するようにデリゲートメソッドを設定しています。問題は、デリゲートメソッドが呼び出されないことです。デリゲートとすべてを設定していますが、問題が発生している理由がわかりません。
私のコードを見てください!関連するコードのみを投稿しました。
MKAsyncImageDownloader.h
MKAsyncImageDownloader.m
NSOperationのMKOperation.mサブクラス。MKAsynImageDownloaderを割り当て/初期化して、セレクターのみを実行します。コード:
RootViewController.h
RootViewController.mデリゲートを設定する方法を示すためだけに。
iphone - NSOperationQueue を再開するための接続通知
インターネットからいくつかの画像をダウンロードする必要があり、現在使用してNSOperationQueue
います。
ダウンロードを一時停止/再開できるインターネット接続通知を受信できるかどうかを知りたいです。
ダウンロードをフリーズする必要はありませんが、それをNSOperation
キューに戻し、接続が再開されるのを待つだけで素晴らしいでしょう.
何か案は?:)
objective-c - NSOperation & NSOperationQueue フリーズ アプリケーション
NSOperationQueue と NSOperation を使用して、Twitter への要求を実行しています。ただし、このリクエストを実行して結果を受け取ると、すべての結果がダウンロードされるまでアプリケーションが数秒間フリーズします。
これを止める方法はありますか?
編集 - -
私のコードは次のとおりです。
TwitterRequest (NSOperation)
}
}
ツイッターマネージャー:
公開タイムラインを取得するためのコードのみを投稿しました。
objective-c - キューに入れられた nsoperation の割り当て解除されたデリゲートを適切に処理する方法
私の現在のプロジェクトでは、いくつかのビュー コントローラー ( など)が、静的な NSOperationQueue で実行されるvc
NSOperation オブジェクト ( など) を生成します。operation
操作が待機中または実行中の場合、委譲 ( operation.delegate = vc
、割り当てられていない、保持されていない) を介してビュー コントローラーに報告されます。
ただし、これらの操作には時間がかかる場合があり、その間にアプリはビュー コントローラーの割り当てを解除できます (ナビゲーション コントローラーのスタックからポップすることにより)。
ここまではすべて意図的です。静的な NSOperationQueue を含むクラスには操作に戻る方法があるため、View Controller は操作を保持しません。それらは alloc/init/autoreleased であり、キューに入れられます。
現在、これも問題を引き起こしています。ビュー コントローラーの割り当てが解除された後、NSOperation の強力なデリゲートを呼び出すと、不正なアクセス違反が発生します。私が理解していることから、この質問に記載されているように、ポインターのオブジェクトが割り当て解除されているかどうかを確認することはできません。
私が考えることができる 1 つの修正は、操作を保持し、dealloc で operation.delegate を nil に設定することです。しかし、追跡するために多くの追加のivar /プロパティが導入されるため、それは私の最も人気のない修正です。
したがって、私の質問は、この問題を回避する他の方法はありますか? もしそうなら、ここにスケッチしていただけますか?
乾杯、
EP。
解決策:私にとって最もうまくいったアプローチは、ギリアーノの答えをわずかに変えたものでした:
キュー マネージャーにすべてのデリゲート プロトコルを実装することは現実的ではありません (50 以上のメソッドを持つ 20 以上の異なるプロトコル)。そのため、直接デリゲートの割り当てを維持しました。私が変更したのは、割り当て呼び出しを行うクラスです。これは、以前は要求を作成したクラス (およびデリゲート) でしたが、現在はキュー マネージャーにオフロードされています。
キュー マネージャーは、デリゲートを操作に割り当てるだけでなく、デリゲートと操作のペアを追跡するために、可変のセカンダリ ディクショナリも保持します。
すべてのデリゲート インスタンスは
[QueueManager invalidateDelegate:self]
割り当て解除時にメソッドを呼び出し、デリゲートに属するリクエストを検索して nil します。次に、ディクショナリ操作/デリゲートのペアも削除され、操作の適切な割り当て解除が可能になります。最後に、KVO
isFinished
が各操作のプロパティを監視することで、変更可能な dict がクリーンに保たれ、すべての操作保持カウントが終了後に実際に割り当て解除されるようになります。
これをクラックするために KVO を使用するためのヒントを提供してくれた Guiliano に感謝します!