問題タブ [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(iPhone)を使用する場合のモデルクラスの非アトミックプロパティ?
カスタムNSOperationサブクラス(NSOperationQueueを使用)によってアクセスされるNSMutableDataivarを持つカスタムモデルクラスがあります。依存関係を使用することで、複数のNSOperationsからivarへのスレッドセーフなアクセスを保証できると思います。また、Qがすべての操作を完了するまで待つことで、他のコード(メインアプリスレッドなど)からivarにアクセスしないことを保証できます。 。
非アトミックプロパティ仕様を使用する必要がありますか、それともアトミックのままにする必要がありますか?パフォーマンスに大きな影響はありますか?
cocoa - オブジェクトが NSOperations から管理対象オブジェクト コンテキストに追加されたときに NSOutlineView が更新されない
バックグラウンド
- コア データを使用する Cocoa アプリ 2 つのプロセス - デーモンとメイン UI
- デーモンが常にデータ ストアに書き込みを行っている
- UI プロセスが同じデータ ストアから読み取る
- NSTreeController にバインドされた UI の NSOutlineView の列
- NSTreeControllers managedObjectContext は、delegate.interpretedMOC のキー パスを持つアプリケーションにバインドされます。
- NSTreeControllers エンティティは TrainingGroup に設定されます (NSManagedObject サブクラスは JGTrainingGroup と呼ばれます)
私が欲しいもの
UI がアクティブになると、デーモンによって挿入された最新のデータでアウトライン ビューが更新されます。
問題
メインスレッドアプローチ
関心のあるすべてのエンティティをフェッチし、refreshObject:mergeChanges:YES を実行してそれらを反復処理します。これは問題なく動作します - アイテムは正しく更新されます。ただし、これはすべてメイン スレッドで実行されるため、更新中に UI が 10 ~ 20 秒間ロックされます。では、これらの更新をバックグラウンドで実行される NSOperations に移動しましょう。
NSOperation マルチスレッド アプローチ
refreshObject:mergeChanges: 呼び出しを NSOperation に移動するとすぐに、更新が機能しなくなります。ログ メッセージを追加すると、新しいオブジェクトが NSOperation サブクラスによって読み込まれ、更新されることは明らかです。私が何をしても、 NSOutlineView が更新されないようです。
私が試したこと
私はこれを2日間しっかりといじり、考えられるすべてを試しました。
- エンティティ名の代わりにオブジェクト ID を NSOperation に渡して更新します。
- データの更新後、アウトライン ビューの再読み込み前など、さまざまな時点で解釈された MOC をリセットします。
- NSOutlineView をサブクラス化しました。ここでおかしなことが起こった場合に備えて、サブクラスを破棄し、ビューを NSOutlineView のインスタンスに戻しました。
- NSOutlineView データをリロードする前に、rearrangeObjects 呼び出しを NSTreeController に追加しました。
- 使用していたすべての管理対象オブジェクト コンテキストで、失効間隔を 0 に設定したことを確認しました。
この問題は、メモリ内のコア データ オブジェクトのキャッシュに何らかの形で関連していると感じています。しかし、これを機能させる方法についてのアイデアはすべて使い果たしました。
なぜこれが機能しないのかについて光を当てることができる人には、永遠に感謝します.
コード
メインスレッドアプローチ
NSOperation マルチスレッド アプローチ
更新 1
この質問を見つけました。私が投稿する前にどうしてそれを見逃したのか理解できませんが、要約すると、コアデータは私がしていることを行うように設計されていません. 1 つのプロセスのみがデータ ストアを使用する必要があります。
NSManagedObjectContext および NSArrayController のリセット/リフレッシュの問題
ただし、アプリケーションの別の領域では、データ ストアを共有する 2 つのプロセスがあり、1 つのプロセスが読み取り専用アクセスを持っていますが、これは正常に機能しているように見えました。さらに、このトピックに関する私の最後の質問に対する回答のどれも、これが Core Data でサポートされていないことを述べていませんでした。
一度に 1 つのプロセスだけがデータ ストアに書き込むように、アプリを再構築します。しかし、これが私の問題を解決するかどうかはまだ懐疑的です。私には NSOutlineView の更新の問題のように見えます-オブジェクトはコンテキストで作成され、アウトラインビューがそれらを拾わないだけです。
iphone - IconDownloader、遅延ダウンロードの問題
私の問題は説明するのは簡単ですが、解決するのは難しいようです。IconDownloader.m
問題は、Apple の公式の例で提供されているようなカスタム クラスを使用してアイコンをロードすることで、ビューを解放するとクラッシュが回避されます。
クラスをアプリに追加しましたIconDownloader
が、このアプローチが適切なのは、テーブルビューがルートである場合のみであることは明らかです。大きな問題は、ビューがルート ビューでない場合です。Fe: 2 番目のビューのスクロールを開始し (アプリがアイコンをロードするようになりました)、ダウンロードを完了する時間を残さずにルートに戻ると、ビューを新しいアイコンで更新する必要があるため、アプリがクラッシュします。もう存在しません。
考えられる解決策の 1 つは、ビューに を実装することOperationQueue
ですが、このアプローチでは、ビューを変更したときにキューを停止し、戻ってきたときにキューを再起動する必要があり、N 個のキューを持つという考えは私を熱狂させません。
この問題の良い解決策を見つけた人はいますか?
cocoa-touch - ココア&ココアタッチ。プレーンな ole ポインターから NSData オブジェクトを作成するにはどうすればよいですか?
NSOperation インスタンス内のデータ全体を malloc しました。私はポインタを持っています:
これを NSData インスタンスとしてパッケージ化し、メイン スレッドに返すにはどうすればよいですか? NSData インスタンスに変換した後、次のように簡単に呼び出すことができると想定しています。
はい?
また、メインスレッドに戻って、どうすればポインタを取得できますか?
ありがとう、
ダグ
iphone - NSOperation で追加の保持が必要
iPadアプリを開発しています。NSOperation を使用して、NSOperationQueue によって処理されたバックグラウンドで何かをダウンロードします。NSOperation に保持を追加しない限り、操作のアクションが実行された後にクラッシュすることがわかりました。NSOperationQueue の addOperation は、NSOperation を保持すると言い、NSOperation 自体はターゲット オブジェクトを保持します。したがって、追加の保持が必要な理由がわかりません。
非同期操作をキャンセルしてその場所に新しい操作を作成するパターンを実装しようとしていることを除いて、これは私の進歩を妨げません。iPhone OS 4.0 ではまだ開発できません (waitUntilFinished を提供します)。そのため、追加の保持を解放しても安全であることを知る別の方法が必要です (または、余分な保持をまったく行わないようにする方法を見つけます)。
助言がありますか?
iphone - NSOperationKVOの問題
次の関数を使用して、nsoperationqueueでの操作が終了した後にアプリケーションに通知を受け取り、操作の結果に応じてタスクをスケジュールできるようにしています。私が使用しているもの:
私の質問は、これらの操作に割り当てられたタスクのほとんどは、他のボタンをタップしようとしたり、基本的にアクションを実行しようとしたりすると、データの解析であるため、次の例外が発生します。
私はメインスレッドで他のことをしようとしているので、メインスレッドへの呼び出しが原因であることを完全に理解しています。
実行に失敗します。しかし、この問題の解決策は、ユーザーがリクエストを行った後に任意のアクションを実行できるようにすることと、操作に割り当てられたタスクを完了した後にスケジュールされたアクションを実行できるようにすることの両方を許可することです。
それは本当に可能ですか?
よろしくお願いします。
iphone - 2 つの NSManagedObjectContext を同期する方法
coredata を使用する iPad アプリケーションに取り組んでいます。Web 上にあるデータベースの情報をダウンロードし、coredata に記録します。アプリケーションは分割ビューに基づいています。私の問題は、バックグラウンドでデータのダウンロードと記録を行うことでした。
これが私が行った方法です:
- データのダウンロードと記録を行う NSOperation を作成しました。
- この NSOperation は appDelegate のコンテキストとは異なる NSManagedObjectContext を使用し、 appDelegate にあるこの関数によって返されます:
- NSOperation にオブザーバーがあり、コンテキストを保存するときに appDelegate でこの関数を呼び出して、デリゲートのコンテキストも変更します。
しかし、私は問題を抱えています.appDelegateのコンテキストで初期化されたNSManagedObjectContextを持ち、NSFetchedResultsControllerをデータソースとして使用するrootViewController(UITableViewController)のデータは自動的に実現しないため、同期が機能しません通常はそうしなければならないので、情報。
だから私はあなたに尋ねます:
私は何を間違えましたか?2 つの異なるコンテキストを使用してそれらを同期させるのは良い方法ですか?
iphone - NSOperationQueue スレッドのディスパッチが遅い?
NSOperationQueue を使用して最初のマルチスレッド iPhone アプリを作成しています。これは、独自のスレッド ディスパッチを管理するよりもロードが優れており、潜在的に高速であると聞いたからです。
ボードを別々のピースに分割し、別々のスレッドで各ボードを計算してから、それらをつなぎ合わせることによって、ライフ ゲーム ボードの結果を計算しています。 . ボードごとに NSInvocationOperation オブジェクトを作成し、それらを OperationQueue に送信しています。ボードのすべてのパーツを送信したら、OperationQueue への waitUntilAllOperationsAreFinished 呼び出しですべての計算が完了するのを待ちます。
これは機能するはずのように見えますが、問題なく機能しますが、スレッドが非常にスローアウトされるため、マルチスレッド バージョンではシングル スレッド バージョンよりも計算に時間がかかります。ああ、いや!NSOperationQueue に送信された NSOperations の作成と終了を監視したところ、後で呼び出されるまでしばらくの間、Operation Queue do-diddly-daddlin に留まっているものがあることがわかりました。最初は、「キューが一度に処理できるスレッドの数は非常に多いかもしれない」と考えてから、キューの maxConcurrentOperationCount を任意の高い数値 (ボードピースの量をはるかに超える) に上げましたが、同じことを経験しました!
誰かが NSOperationQueue を「オーバードライブ」に追い込む方法を教えて、キューをできるだけ早くディスパッチするように言うことができるかどうか疑問に思っていました.それか、何が起こっているのか教えてください!
uiview - NSOperationがサブビューをメインビューに追加しない
NSOpeationを使用すると、奇妙な動作が発生します。UIButtonを作成してビューに追加する関数(-createTagView)を呼び出しています。何らかの理由でそれらを追加していません。NSOperationの外部から関数を呼び出すと、すべてが正常に機能します。
何か案は?ありがとう。
これは、NSOperationを(ViewControllerオブジェクト内で)作成する方法です。
そしてこれは呼ばれる関数です([タグビュー]はUIButtonです):
objective-c - 自動解放された NSTask が NSOperation スレッドの実行ループを無期限にブロックするのはなぜですか?
NSTask
内からを起動しようとしているときに に遭遇しましたNSOperation
。
これは、問題を紹介するためにまとめた非常に単純なアプリです。ボタンをクリックすると、NSOperation
がキューに入れられます。をセットアップしNSRunLoop
、 を呼び出すメソッドを呼び出しますNSTask
。タスクは非常に単純です。2 秒間起動するだけ/bin/sleep
です (正常に動作しているときにスピナーを簡単に確認するのに十分な時間です)。
アプリは宣伝どおりに動作しますが、TaskPerformer.m の 23 行目をautorelease
, (申し訳ありませんが、私は新しい投稿者なので、直接リンクできません) に変更するか、完全にコメントアウトすると (NSTask
オブジェクトがリークします)、NSOperation
「 s スレッドは決して終了しません。メインの実行ループが何かをブロックしているようです。
さて、ここでの問題は 2 つあります。まず、スレッドがブロックされている理由がわかりませんが、さらに、このアプリケーションのガベージ コレクションをオンにすると、同じ動作が現れます。を手動で解放する方法がないためNSTask
、スレッドは何があってもブロックされます。
誰かが私に何が起こっているのか教えてくれたら、私は永遠に感謝します!