問題タブ [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 - iPhone / iOS popViewControllerAnimated 画面を更新しない
画面が適切に更新されず、ポップされたビューが表示されたままになっているが、明らかに割り当てが解除さ.navigationController popViewControllerAnimated:YESれている場所から呼び出すと、奇妙な問題が発生します。NSOperation
sqlite詳細: ローカルデータベースにアクセスするリスト ビューがあります。レコードをタップすると、そのレコードの詳細ビューが表示され、(メイン スレッドで) 非同期の NSOperation が開始され、XML バックエンド データベースをチェックして、そのレコードがまだデータベースで使用可能かどうかが確認されます。アーキテクチャ上の理由から、この操作はリスト ビューでは実行できません。詳細ビューで実行する必要があります。最後の同期以降にレコードが削除された場合、レコードが削除されたことをユーザーに通知popViewControllerAnimatedし、共有アプリのデリゲートで を呼び出します。理想的には、これにより現在の詳細ビューがポップされ、前のリスト ビューに戻ります。
エラー: 適切なビューが実際にはメモリにポップされていますが (割り当てが解除されています)、まだ画面に表示されています。ナビゲーション バーは空白ですが、「戻る」ボタンがあるべき場所をクリックすると、リスト ビューの前に開始画面に移動します。つまり、少なくともナビゲーション バーは本来あるべき場所を理解しています。タイトルまたは戻るボタンが正しく表示されない場合。主な問題は、詳細ビューがまだ表示されていて操作できるため、アプリケーションがクラッシュすることです。たとえば、詳細ビューにもデータが表示され、ユーザーがテーブルを下にスクロールすると、「メッセージが割り当て解除されたインスタンスに送信されましたUITableView」という例外がスローされます。-[xAccountDetailController tableView:cellForRowAtIndexPath:]:
これにより、呼び出しによって詳細コントローラーの割り当てが適切に解除されたと思われますが、ビューコントローラーがナビゲーションコントローラーからポップされたとしてもpopViewControllerAnimated、テーブルが実際に を呼び出す場合、明らかに何かがまだメモリに存在します。cellForRowAtIndexPath
詳細ビュー (バックエンドで削除されていないレコードの場合) で戻るボタンを手動で押すと、完全に機能します。
回避策: NSOperation に詳細ビュー コントローラーへの参照を渡すときに、popViewControllerAnimatedそのビューの navigationController プロパティから直接、および共有アプリ デリゲートから を呼び出そうとしました。また、2 つのビューをポップして、リスト ビューを navigationController に再プッシュしようとしましたが、ルート ビュー コントローラーとリスト ビュー コントローラーがナビゲーション バーに同時に存在するように見える (タイトルが互いに上書きされる) さらに厄介なインターフェイス効果が発生します。存在しないのではなく)。NSOperation に存在する詳細ビュー コントローラーへの参照を nil に設定しようとしましたが、何もしません。ポップする前に a を呼び出してみまし[detailView release]たが、予想どおり、リリース前の保持カウントが 1 しかなかったため、ポップで失敗します。私'popToViewControllerそしてpopToRootViewController、何も機能していないようです。古いビューは常にそこにあり、ナビゲーション バーは何かを実行しているように見える唯一のインターフェイス要素であり、それでも正しく表示されません。ビューが表示されたまま(ポップなし)になってもかまわないので、テーブルのリロードも試みましたが、データをクリアしたいだけですが、何らかの理由でテーブルが reloadData しません。
考え: NSOperation を実行している operationQueue は問題の詳細ビューのプロパティであるため、詳細ビューの dealloc で cancelAllOperations を実行し、operationQueue への参照を nil に設定するようにしました。また、他のオブジェクトのそのビューへのすべての参照が nil に設定されていることを確認しようとしました。詳細ビューのボタンから直接呼び出すpopViewControllerAnimatedことは完全に機能するため、ポップしたい詳細ビューのプロパティである NSOperationQueue で実行されている NSOperation からそのメソッドを呼び出しているという事実に違いありません。どこかの参照がそのビューを部分的に維持しているに違いありませんが、ポップが呼び出されたときにまだビューを参照しているものを見つけることができないようです。
ここに投稿するにはあまりにも多くの場所にコードが多すぎます。
何かご意見は?
長い質問で申し訳ありませんが、よろしくお願いします。
グレッグ
編集 1: 新しい UIViewController を使用して、NSOperation の外部でこの問題を簡単に再現できます。
メソッドでは、次のtableView:didSelectRowAtIndexPathように呼び出します。
vc では、popView メソッド:
これは保持カウントや NSOperation とは関係ないと思います。この方法でビューをポップすることで根本的に間違ったことをしていますか?
iphone - NSOperationキューの問題
こんにちは私は同じメソッドでアクセスしている2つのメソッドを持っていますredrawViewそれらはmoveThePlayerWithDeltasAndQueueとmovethePlayerAroundYAxisAndQueueですコメントされたコードのように操作キューを使用したいのですが、キューを構築するための正しい方法は何ですか?それらを正しく働かせますか?
iphone - NSOperation(s)はiOS3デバイスでのみリークします
CoreDataのインポートを処理するNSOperationsサブクラスがいくつかあります。メインスレッド以外の問題のほとんどにチェックを入れたと思います
mainメソッドで独自の自動解放プールを作成しますNSManagedObjectContext操作ごとにを作成します
これらの操作はNSOperationQueueにロードされ、同時操作の最大数は1に設定されます。
コードはiOS4.0.1で完全に機能しますが、iOS 3.1.3デバイスでは、次のような多くのログメッセージが表示されます
NSOperationサブクラスのメインメソッド
__lookup:inContext:方法_
他のほとんどのメソッドはメソッドをインスタンス化します。つまりthreadContext、メソッドに似てい__lookup:inContext:ます。インスタンスメソッドの自動解放プールを作成しないことは知っていますが、自動解放がどのように機能するかについての私の理解によれば、これらのメソッドがメインメソッド内でのみ呼び出される限り、NSAutoreleasePool作成された後、最も外側のプール使用すべきです。NSManagedObjectContextなどのオブジェクトを怠惰に作成し、ほとんどの場合、startメソッドを使用しません
iphone - NSOperations を使用した iOS アプリのアーキテクチャ
2 か月前、私は新しい iPhone アプリケーションの作成を開始しました。このため、ユーザー認証、ユーザー プロファイル、フレンドシップ システム、メディア処理、メッセージングなどの必要な機能を多数持つことができる、一般的な RESTFul Web サービスを作成しました。システムなど。私の考えでは、将来の iPhone アプリケーションでこの Web サービスを再利用するユースケースがいくつかあります。
このような心構えで、メディア (画像、ビデオ、サウンド) のセットアップと処理、Web サービスとの通信、解析とマッピングなどのすべての重労働を処理する、このアプリケーション (および将来のすべてのアプリケーション) 用の静的ライブラリを作成することにしました。結果の処理、CoreData の処理など。
私のアプリケーションでは、多くの並列タスクが実行されているシナリオがあります (最悪の場合)。たとえば、ユーザーが現在自分のプロフィール写真を変更しているときに、アプリケーションがユーザーの場所を (バックグラウンドで) サーバーに送信し、新しいプッシュ通知が送信されます。受け取った。
そこで、各論理操作 (SendUserLocation や GetCurrentFriendList など) を NSOperation にカプセル化し、それらを serviceQueue (NSOperationQueue) に追加することにしました。
各操作は、操作が Web サービスから結果を正常に取得し、すぐに処理する必要がある場合にサブタスクを生成できます。

典型的な ServiceManager メソッドは次のようになります
各操作、(サーバーへの) 要求、および subTask は、GUID を notificationName として使用して、処理が完了したときに親オブジェクトに通知します。操作のすべてが完了すると、ユーザー インターフェイスに通知が返されます。
とはいえ、サブタスクを追加および削除するためのコードは次のようになります
あとは、GUI で serviceManager を呼び出して、次のような特定の操作を開始するだけです。
オブザーバーを登録したい場合は、次のようにオブザーバー オブジェクトとセレクターを渡すだけです。
最後になりましたが、私の質問: 「アーキテクチャ」は非常にうまく動作し、安定していますが、実行する価値はありますか? オーバーヘッドが多すぎますか? それは理にかなっていますか?個人的には、並行操作をどのように実装していますか?
ベスト・ヘンリック
PS私の質問を自由に編集し、質問をして(コメントとして)、この考えの名前を呼んでください。
基本的に私は英語のネイティブスピーカーではないので、説明するのに本当に苦労しました. 誤解しないでください。私は、この投稿を何らかの形で自慢するために書いたわけではありません。私がしたいのは学ぶことだけです(そして、より高度なiPhone / Objective Cの質問を書くことかもしれません)
iphone - NSOperationqueu での NSURLConnection の問題
こんにちは、たくさんの PDF ファイルをダウンロードするために NSOperaion Queue を作成しようとしています。しかし、うまくいきません。デリゲート メソッドは、NSOperation キューに入れているため、NSURLConnection に対して呼び出されません。代替手段または解決策はありますか?
iphone - NSOperationを並行してキャンセルできるようにサブクラス化する
並行してサブクラス化する方法とNSOperationキャンセルをサポートする方法についての適切なドキュメントを見つけることができません。Appleのドキュメントを読みましたが、「公式」の例を見つけることができません。
これが私のソースコードです:
私が見つけた例では、performSelectorOnMainThread:が使用されている理由がわかりません。それは私の操作が同時に実行されるのを妨げるでしょう。
また、その行をコメントアウトすると、操作が同時に実行されます。ただし、isCancelledを呼び出してもフラグは変更されませんcancelAllOperations。
iphone - NSOperationQueue が iOS 4.0 で正しく動作しないのはなぜですか?
以前は iPhone OS 3.0 の iPhone アプリで NSOperationQueue を使用していましたが、iOS 4.0 ではコードが正しく機能しません。一度だけ正しく実行され、その後のすべての呼び出しでは機能しません。iOS 4.0 の NSOperationQueue に変更はありますか?
関連するコードは次のとおりです。
iphone - 操作をキャンセルするときにASIHTTPRequestとNSOperationQueueでクラッシュする
NSOperationQueueでリクエストをキャンセルしようとすると、非常に苦労します。
'engine'オブジェクトの割り当てを解除する前に、cancelOperationsメソッドを呼び出してキュー内のすべてをキャンセルします。これには、フライト中のASIHTTPRequestsとキューに入れられたものが含まれます...例:
Engine.m
現在、私のエンジンにはいくつかのgetContentタイプのメソッドがあるため、キューにはさまざまなリクエストオブジェクトが含まれています。Engineオブジェクトを使用する場合のフローは次のとおりです。
1)ViewControllerを開きます-viewdid load --alloc and init Engine object
2)//さまざまなgetContentスタイルメソッドを呼び出して一部の操作をキューに入れます
3)viewが終了したら、[enginecancelOperations]を呼び出します。(a)実行中のネットワーク要求を停止し、キューを空にするために
4)ビューの割り当てを解除し、それを使用してエンジンを次のようにします。[エンジンリリース];
これは、すべてのリクエストがキューで終了した場合(空であるため)は正常に機能しますが、リクエストがアクティブなときにcancelOperationsを実行すると、アプリケーションがEXC_BAD_ACCESSエラーでクラッシュします...しかし、エンジンの割り当てが正常に解除された後...
なぜこれになるのか、何か考えはありますか?
--編集-エラーのバックトレースを追加します:
objective-c - NSOperationのベストプラクティス、キャンセルへの対応
NSOperationサブクラスでは、長いループの先頭で、またはサブクラスのメソッドの長いメソッド(Core Data Fetches、配列の並べ替えなど)の前にキャンセルをチェックしますmain。以下の例を参照してください。
プールを空にし、できるだけ早くメソッドを終了する以外に、他にすべきことはありますか?
iphone - iphone OS での NSOperationQueue と NSOperation の使用に関する問題
私はタスクを実行するため
にNSOperation を使用しています: NSURLConnection でいくつかのファイルをダウンロードしてから、多くの CPU とメモリ
を消費するファイルをマージします 新しい/バックグラウンド スレッドでタスクを実行する必要があります。ファイルをマージすると、メインスレッドがブロックされます(UIがしばらく応答しません)、新しい/バックグラウンドスレッドで実行されていないよう
です。どうすれば期待どおりに動作しますか?