問題タブ [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 - OpenFlow での AFGetImageOperation
OpenFlow に AFGetImageOperation を実装する正しい方法は何ですか?
aImage.imageURL要求された画像の URL を持っていますが、取得した画像がどこに保存されているかわかりませんか?
ありがとう
objective-c - iOS 3 の [NSOperationQueue mainQueue] の代替
iOS3でのこれらの操作に相当するものは何ですか?
multithreading - NSOperation は新しいスレッドを生成しますか?
簡単に言うと、スレッド (または NSThread) と NSOperation の間に 1 対 1 の接続がありますか? それとも、操作がバックグラウンドで複数のスレッドによって取得および実行できる一種のタスクであると抽象化されていますか?
objective-c - NSOperationQueueおよび非同期リクエストを実装するオブジェクトを解放する正しい方法
私は自分の問題の解決策を見つけるのに苦労しています、
APIへの呼び出しを処理するDownloadクラスがあり、これらの呼び出しはNSOperationQueueに追加されます。各呼び出しには、呼び出しが完了または失敗したときに投稿する、完了および失敗した通知機能が割り当てられます。その後、ViewControllerでリクエストの完了/失敗を適切に処理できます。
私が抱えている問題はこれです。ダウンロードクラスをalloc/init/releaseする正しい方法は何ですか。私の最初のアプローチは次のようなものでした。
リクエストを実行する必要があるたびに、ダウンロードクラスの新しいインスタンスを割り当てます。そうすれば、必要に応じて、一意の完全な通知機能と失敗した通知機能、およびその他のパラメータを使用して、クラスの一意のインスタンスを作成できます。このアプローチで私が抱えていた問題は、いつ/どのようにオブジェクトを解放するかです。ダウンロード呼び出しには完了キューと投稿通知があるため、単純にフェッチ要求を呼び出してから同じ呼び出し内でオブジェクトを解放することはできません。ダウンロードクラスのインスタンスが通知のために呼び出しを終了したときはわかります。別の関数からのリリースを実装する正しい方法がわかりません。例えば:
次に、ダウンロードをどこでリリースし、正しいインスタンスをリリースしていることを確認すると、downloadListsが(n)回連続して呼び出される場合があります。
私の他のアプローチは、ダウンロードのシングルトンを使用することでした。これは、通知にuserinfoを追加する必要があるまでは素晴らしかったですが、もちろん、さまざまな場所から呼び出されるシングルトンクラスによって混乱しました。
どんな助けでも大歓迎です、ここにあなたの参照のためのdownloadPOST関数があります:
iphone - NSOperation はバックグラウンドで終了し、メイン スレッドへの通知を試みます。ビューは存在しません。クラッシュ
メインスレッドではなく NSOperation を実行しています。UITableViewController から生成されます。操作が完了したら、一部のデータが変更されたため、テーブルビューをリロードしたいと思います。バックグラウンドで完了時に通知するデリゲートを設定しました。完了したら、特に performSelectorOnMainThread を使用して、メイン スレッドで reloadData のラッパーを呼び出します。
ほとんどの場合、これはうまく機能しますが、元の (edit)tableViewController (/edit) が解放され、ゾンビ コールが発生する可能性が 0 ではありません。
したがって、質問は2つの部分にあります。
- オブジェクトを保持せずにバックグラウンド スレッドからデリゲートを持つことは可能ですか?
- これは単にデザインが悪いのでしょうか?代わりに NSNotifications を使用する必要がありますか? この場合、それが好ましい通知方法でしょうか?
前もって感謝します。
macos - NSOperation サブクラスのメインが呼び出されていない
NSOperation をサブクラス化し、main メソッドを実装しました。NSOperationQueue に追加したとき、呼び出されていませんでした。私はそれをサンプルコードとサンプルプロジェクトと比較しました が、問題が何であるかはわかりませんでした。誰かがこの問題の経験があり、その原因は何ですか?
問題を見つけようと夢中になった後、最初からやり直して、クラスを再構築し、各ステップでテストすることにしました。ヘッダーで、NSOperation のサブクラスとして宣言しました。実装ファイルでは、main を実装し、次の 2 行だけを追加しましたsleep(3)。NSLog..;. すべて良い。プロパティの追加、デリゲートの宣言などを開始すると、各ステップが機能しました。
最後に、主に、NSDirectoryEnumerator を使用するコードを配置します。突然、メインがまったく呼び出されなくなりました。それだけでなく、そのコードを元に戻しても、まだ機能しません!! XCode 4 を再起動して、自分のマシンを再起動しようとしましたが (これらが役立つ理由はわかりませんが、アイデアが不足しています)、すべて役に立ちませんでした。
どんな手がかりでも大歓迎です。ありがとう。
更新: 私は (また!) ゼロからやり直しましたが、今回は別の順序でパーツを組み立てました...そして今では動作します! ただし、とにかく間違っていることがあり、今回は幸運だった場合に備えて、@Andrew が提案した @interface セクションを次に示します。
cocoa-touch - これはオペレーション キュー完了ブロックの正しい使用法ですか?
初めて Objective-C ブロックとオペレーション キューを使用しています。メイン UI にスピナーが表示されている間に、いくつかのリモート データを読み込んでいます。完了ブロックを使用して、テーブルにデータをリロードするように指示しています。ドキュメントに記載されているように、完了ブロックはメイン スレッドで実行されないため、テーブルはデータをリロードしますが、テーブルをドラッグするなどのメイン スレッドで何かを実行するまでビューを再描画しません。
私が現在使用しているソリューションはディスパッチ キューです。これは、完了ブロックから UI を更新する「最良の」方法ですか?
更新 @gcamp の提案に従って、完了ブロックは GCD の代わりにメイン操作キューを使用するようになりました。
objective-c - Objective C でのスレッド化
cpp コードを Objective C に移植しています。このプログラミングは初めてです。
このスレッドがtimeoutThread.と呼ばれる関数を呼び出しているスレッドを開始する必要があり、insert()と呼ばれる1つの関数でsetEvent(m_Thread)でイベントを設定し、関数timeoutThreadでwaitforsingleobject(m_thread、遅延)とwaitforsingleObjectのすぐ上で、setEvent(m_ThreadEvent)によって別のイベントを設定し、タイムアウトスレッド関数内で他のスタッフを実行しています。私は NSOperationQueue を作成し、initWithTarget:toTarget:object で関数を呼び出しました。しかし、Objective C の cpp で行っているのと同じように、イベントを設定して通知するにはどうすればよいですか?
これに関する簡単な例での説明は、私のような初心者にとって非常に役立ちます。
ios - iOS3.xのGCDシリアルディスパッチキューに相当します
AppleのGrandCentralDispatch(GCD)は素晴らしいですが、iOS4.0以降でのみ動作します。Appleのドキュメントには、「[A]シリアル化された操作キューはGrand Central Dispatchのシリアルディスパッチキューとまったく同じ動作を提供しません」と記載されています(キューはFIFOではなく、順序は依存関係と優先順位によって決定されるため)。
GCDがリリースされる前のOSバージョンをサポートしながら、GCDのシリアルディスパッチキューと同じ効果を達成する正しい方法は何ですか?言い換えれば、4.0未満のバージョンをサポートしたいiOSアプリで単純なバックグラウンド処理(Webサービスリクエストの実行など)を処理するための推奨される方法は何ですか?
core-data - NSOperationQueue と NSFetchedResultsController
queue と resultscontroller の組み合わせを使用して、一部のコアデータ オブジェクトを更新および表示します。
私のuitableviewcontrollerでは、X秒ごとにメインコントローラーオブジェクトのメソッドを呼び出します。
このメソッドでは、カスタム NSOperation オブジェクトがメイン Q に追加されます。
操作自体は、新しい managedobjectcontext を作成し、web からいくつかの xml をダウンロードしようとし、coredata データベースを更新しようとします... (このコードは機能します!)
私のメインコントローラーでは、コンテキストが変更されたメッセージを受け取り、mergeChangesFromContextDidSaveNotification を使用してメインオブジェクトのコンテキストをマージおよび更新します。すべての resultscontroller は、このメイン オブジェクト コンテキストを使用します。
実際にはすべて機能しますが、NSOperation 内に新しいオブジェクトを挿入すると、UI が更新されてこの新しいオブジェクトが表示されるまでに 4 ~ 6 秒かかります...さらに、UI がブロックされます...スクロールしたり、他の相互作用をトリガーしたりすることはできません.. .
キューを使用せず、オブジェクトをダウンロードして更新するコードを uitableviewcontroller クラス内のメソッドに配置し、これを使用する場合
すべてが非常にうまく機能し、遅延や UI のフリーズはありません...
誰かが私にこの振る舞いを説明できますか?
ありがとう