問題タブ [nsblockoperation]

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.

0 投票する
1 に答える
880 参照

objective-c - Objective-cブロックをネストするときの構文/フォーマット

私はブロックを入れ子にしています、そしてそれは醜いように見えます。これをそれほど醜くなく書く方法はありますか?構造的ではなく、主に構文の提案を探していますが、どちらも受け入れます。

私のブロックファクトリメソッド、

これは、これに類似した多くの関数から呼び出されます。

queueはNSOperationQueueオブジェクトです。すべての(醜い醜い)キャストなしではコンパイルされません。アミドイニトライト?

編集:Dave DeLongの回答、およびhttp://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/に従って、行を変更しました

することが、

0 投票する
3 に答える
1077 参照

objective-c - NSBlockOperationおよびNSAutoreleasePool

通常、サブクラスを作成するときは、メソッドでのNSOperation作成と解放を担当します。NSAutoreleasePool-main

を使用する場合NSBlockOperation、ブロックに自動解放プールを作成する必要がありますか?

0 投票する
10 に答える
67589 参照

objective-c - バックグラウンド スレッドで NSTimer を作成するにはどうすればよいですか?

1秒ごとに実行する必要があるタスクがあります。現在、NSTimer が 1 秒ごとに繰り返し起動しています。バックグラウンド スレッド (非 UI スレッド) でタイマーを起動するにはどうすればよいですか?

メイン スレッドで NSTimer を起動し、NSBlockOperation を使用してバックグラウンド スレッドをディスパッチすることもできますが、これを行うためのより効率的な方法があるかどうか疑問に思っています。

0 投票する
1 に答える
343 参照

ios - viewDidLoad でサウンド リソースを非同期にロードするとクラッシュする

全て、

UIViewController をロードするときに、一連のサウンドを非同期的にロードしようとしています。ほぼ同時に、(時折) UIView を ViewController の階層の一番上に配置して、ヘルプ オーバーレイを表示しています。これを行うと、アプリが不適切な exec でクラッシュします。ビューが追加されていない場合、アプリはクラッシュしません。私のViewControllerは次のようになります。

SoundHelper(「initWithSounds」から呼び出される)のメインの非同期読み込みメソッドは次のようになります。

ブロックが終了すると、クラッシュが発生するようです。のinitFHSCoachMarkView次のようになります。

NSBlockOperationと の両方を使用して非同期ブロックを呼び出してみdispatch_asyncましたが、どちらも同じ結果になりました。さらに、aysnch 呼び出しを完全に削除し、サウンドをメイン スレッドにロードしました。それはうまくいきます。@Jason で提案されたソリューションも試しました: NSOperationQueue and UITableView release is crashing my appしかし、同じことがそこでも起こりました。

これは実際には FHSCoachMarkView に追加されているビューの問題ですか、それとも両方がアクセスするという事実に関連している可能性がありますmainBundleか? 私はiOSでの非同期コーディングに少し慣れていないので、少し途方に暮れています。どんな助けでも大歓迎です!

ありがとう、スコット

0 投票する
1 に答える
943 参照

iphone - NSBlockOperationがARCをリーク

ブロック自体の内部の「NSBlockOperation」を参照するのに問題があります。操作がキャンセルされたかどうかを確認する必要があります。ARC対応プロジェクトで実行すると、「searchOperation」へのアクセスがリークするだけのようです。

このコードは基本的に何もしませんが、ARC対応のプロジェクトではリークを示していますが、ARC以外のプロジェクトでは正常に機能しています。

ありがとう。

0 投票する
3 に答える
16756 参照

objective-c - NSBlockOperationの学習

私はブロックの大ファンですが、並行性のためにそれらを使用していません。少しグーグルした後、私はこのアイデアをつなぎ合わせて、学んだことをすべて1か所に隠しました。目標は、バックグラウンドでブロックを実行し、それが終了したら、別のブロック(UIViewアニメーションなど)を実行することです...

私の質問は次のとおりです。

  1. 実行すると動作しますが、何かが足りません...隠された地雷ですか?キャンセルをテストしていませんが(長い操作を発明していないため)、それは機能するように見えますか?
  2. 完了ブロックで参照できるように、backgroundOperationの宣言を修飾する必要があるのではないかと心配しています。コンパイラは文句を言いませんが、そこに潜んでいる保持サイクルはありますか?
  3. 「文字列」がivarの場合、ブロックの実行中にKey-Valueでそれを観察するとどうなりますか?または、メインスレッドにタイマーを設定して、定期的にログに記録しますか?進捗状況を確認できますか?アトミックと宣言しますか?
  4. これが期待どおりに機能する場合は、すべての詳細を非表示にして同時実行を取得するための良い方法のようです。なぜAppleは私のためにこれを書かなかったのですか?重要なものが欠けていますか?

ありがとう。

0 投票する
2 に答える
3066 参照

iphone - ALAsset URL を使用してフォト ライブラリ イメージを表示するための ALAsset ブロックを含む NSBlockOperation または NSOperation

私は自分の質問Display photolibrary images in a effectual way iPhone非常に効率的な UITableView "cellForRowIndexPath" method to bind the PhotoLibrary imagesに関してこの質問をしています。

したがって、以下の詳細を読まずに回答が重複しないようにお願いしたいと思います:)

本題に入りましょう、

上記の問題について詳しく調査したところ、ここから操作キューに関するドキュメントを見つけました。

そこで、ALAsset ブロックによる操作キューを使用して、7 つのフォト ライブラリ イメージを表示する 1 つのサンプル アプリケーションを作成しました。

サンプル アプリケーションの詳細は次のとおりです。

ステップ1:

NSOperationalQueueViewController のviewDidLoadメソッドで、すべてのフォト ギャラリー ALAsset URLを という名前の配列に取得しましたurlArray

ステップ2:

すべての URL が に追加されたurlArray後、 if(group != nil)条件は で false になるassetGroupEnumeratorため、 を作成し、ループをNSOperationQueue介して 7 つの UIImageViewを作成し、対応するイメージ ビューURLを使用してサブクラス オブジェクトを作成しました。に追加します。forNSOperationNSOperationQueue

ここでNSOperation私のサブクラスを参照してください。

ここで私の実装(VierwController)クラスを参照して ください

問題に行きましょう。

7 つの画像すべてが一貫して表示されるわけではありません。画像の一部が欠落しています。欠落している順序が複数回変更されています (ある時は 6 番目と 7 番目が表示されず、別の時は 2 番目と 3 番目だけが表示されません)。コンソール ログには、Could not find photo pic number が表示されます。ただし、URL は正しくログに記録されます。

ログの詳細はこちらで確認できます。

私のクラスに間違いはありますか?

また、上記の操作キューのドキュメントを読んだときに、 について読みましNSBlockOperationた。ALAsset ブロックを処理するNSBlockOperation代わりに実装する必要がありますか?NSOperation

NSBlockOperation説明によると

1 つ以上のブロック オブジェクトを同時に実行するためにそのまま使用するクラス。複数のブロックを実行できるため、ブロック操作オブジェクトはグループ セマンティックを使用して動作します。関連付けられたすべてのブロックの実行が終了した場合にのみ、操作自体が終了したと見なされます。

NSBlockOperationサンプル アプリケーションに関して with ALAsset ブロックを実装するにはどうすればよいですか?

私は Stack Overflow の質問Learning NSBlockOperationを経験しました。NSBlockOperationしかし、 with ALAsset ブロックを実装するアイデアが思い浮かびませんでした!!

0 投票する
1 に答える
1203 参照

objective-c - NSBlock操作がキャンセルされない

オンラインでダウンロードされた各セルの画像を表示する uitableview があります。

この呼び出しを非同期にするために、NSBlock 操作を使用します。以前は GCD を使用していましたが、GCD をキャンセルすることはできないため、これを使用することを好みます。その理由は、ビューを離れると、画像がアプリのバックグラウンドでダウンロードされ、前のビューに再び入ると、GCD が再びすべてをキューに入れるため、最終的には画像のスタック全体が存在し、ユーザーは uitableview を見ることはありません。それが、NSBlock 操作を選択する理由です。

ただし、私のブロックはキャンセルされません。これは私が使用するコードです (これは - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ) の一部です:

このコードを使用してキャンセルしました:

ただし、私の NSLog は、ビューが消えた後でも (そこに nslog を置いた後)、まだブロックがあることを示しています。

注意: ビューには毎回 4 つのセルが表示されるため、ビューを離れても、それらはまだキューにあると思います..

0 投票する
1 に答える
522 参照

objective-c - 同じオブジェクトで動作するNSOperationをグループ化し、iOSで終了したことを検出します

5 つの NSBlockOperation がそれぞれオブジェクトの NSArray を生成し、それを UITableView データソースとして機能する共有同期 NSMutableArray に追加する iOS アプリがあります。

操作は互いに独立しており、完了したらすぐに UITableView データの再読み込みを開始する必要があります。

残念ながら、NSOperation でこれを行う方法が見つかりませんでした。別のマルチスレッド設計を使用する必要がありますか?

0 投票する
1 に答える
416 参照

objective-c - NSBlockOperation の粒度ステータス

特定のas 識別子NSOperationQueueを追加できるように拡張しました。NSBlockOperationNSString

識別子の値はNSMutableArrayレジストリとして保持されます。これがレジストリの実装方法です。

基本的に、特定の操作が終了したときにレジストリをクリーニングする完了ブロックを追加しています。

ただし、これは機能しますが、キューにさらに細分性を追加する必要があります。

私はブロック操作でのみキューを使用し、ブロックの実行中に、実行がNSNotificationどのように行われたかに応じて、リスナーに異なるものを送信する場合があります。

私が達成しようとしていたこと:

NSBlockOperation発信者が特定の識別子をキューに追加しようとしました。キューにそのような識別子が既にある場合は、ブロックを追加せず、呼び出し元のクラス自体をリスナーとして設定します。

何が欠けている ?識別子を確認するだけでは十分ではありません。NSBlockOperationすでにディスパッチされているNSNotificationが、完了ブロックがまだ呼び出されていない場合があります。

したがって、呼び出し元クラスはキューに問い合わせます。これは、識別子がレジストリに存在することを示しており、呼び出し元は、既に送信されているために決して到着しない通知をリッスンするように誤って設定されています。

代わりに、シナリオは次のようになります。発信者はキューに問い合わせます。これは、「識別子はレジストリにある」と言っていますが、NSNotification送信されます。そして、呼び出し元がNSBlockOperationキューに入れられました。

レジストリのチェックは、次の簡単な方法で行われます。

しかし、この時点では、そのような方法を拡張する方法についてはあまり考えていません。私が取り組んでいるコードは一種の「学術的」なものであり、特定の目的には役立たず、私が実験しようとしているだけです。したがって、私はコード内で非常に柔軟です。しかし、これは私にとってまったく新しいテーマなので、提案された実装のマイナス面についてできるだけ具体的に教えてください.