質問

働いていた例を通して、並行処理の章の"iPhone3開発"といKVOに NSOperationQueue として期待される。私の作成 NSOperationQueue とを観察し operations 配列の使用:

NSOperationQueue *newQueue = [[NSOperationQueue alloc] init];
self.queue = newQueue;
[newQueue release];
[queue addObserver:self
        forKeyPath:@"operations"
           options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
           context:NULL];

最初の NSOperation 追加のキューに期待する追加信 operations 配列(iOSの文書とはKVO対応)この変化辞書の見からマッピング NSKeyValueChangeKindKeyNSKeyValueChangeInsertion, とともに、マッピングから NSKeyValueChangeNewKey に追加 NSOperation.がんを見てどのような価値 NSKeyValueChangeInsertion.

ピックアップしました。デバッガは、proのすべてのものを何かと便利にコピーここでは、私のオブザーバー方法:

- (void) observeValueForKeyPath:(NSString *)keyPath
                       ofObject:(id)object
                         change:(NSDictionary *)change
                        context:(void *)context {
  NSNumber *kind = [change objectForKey:NSKeyValueChangeKindKey];
  NSObject *newValue = [change objectForKey:NSKeyValueChangeNewKey];
  NSObject *oldValue = [change objectForKey:NSKeyValueChangeOldKey];
  NSIndexSet *indexes = [change objectForKey:NSKeyValueChangeIndexesKey];
  NSLog(@"kind=%d, newValue=%@, oldValue=%@, indexes=%@",
       [kind integerValue], newValue, oldValue, indexes);

ことになる版画

2010-11-18 20:01:56.249 Stalled[2692:6f07] kind=1, newValue=(
    "<SquareRootOperation: 0x5f51b40>"
), oldValue=(
), indexes=(null)

2010-11-18 20:01:56.250 Stalled[2692:6f07] kind=1, newValue=(
    "<SquareRootOperation: 0x5f51b40>"
), oldValue=(
    "<SquareRootOperation: 0x5f51b40>"
), indexes=(null)

(SquareRootOperation 単純に私のクラスのサブクラス NSOperation このオーバーライド main 適切に管理し、 Stalled 簡単に言えば、プロジェクトの名前です。) ただし、メソッドが呼び回に挿入し、単一の操作で、英語が話せなくてもなんとかなる種類の値が1である NSKeyValueChangeSetting, ない NSKeyValueChangeInsertion.また、 newValueoldValue いように配列そのものではなく、項目追加されます。

そのアイデア?よろしく!

役に立ちましたか?

解決

ドキュメントは-operationsはKVO準拠であると言うが、通知がどうなるかを詳細に指定しないでください。実際には、それはあなたが唯一のように挿入されたものを見つけるために古いものと新しい値を比較しなければならない、変更が発生したことを告げているようです。

DOはこれらの通知は、任意のスレッド上であなたに送ることができるということを忘れないで!

他のヒント

の操作性NSOperationQueueいませんので変更可能な型を返します NSArray*).そのたない実行インデックス付きる多くの遵守方法の変更可能な配列でないの挿入イベントのみの変更を示すイベント全体の配列になります。

編集

Shadowmatterのきっかけをつくったのが、この実際に返されたオブジェクトが NSMutableArray.ここにしかなりませんが、しかし、変更あります。まず、 Appleのドキュメント は明らかである。この広告を返す不変のオブジェクトは、尊重しなければなAPIに含まれています。使用してはならない isKindOf: すぐの場合は変更可能なければなりません。レコード店ディスクユニオンに変更します。

このAPIによると、業務の戻り値の型は変更不可能なのでなければなりませんそのためです。より重要なのはその問題については、で変更可能なコレクションではない キー値の符号準拠 を変更可能な配列KVC値です。のために変更可能な物価連動収集コンプライアンス、クラスに

  • 実施のいずれか一方又は双方の手法 -insertObject:in<Key>AtIndex: または -insert<Key>:atIndexes:.
  • 実施のいずれか一方又は双方の手法 -removeObjectFrom<Key>AtIndex: または -remove<Key>AtIndexes:.

撮影されたものから直接、アップルKVCガイド)

デザイナーの NSOperationQueue クラスの設計 operations 物件として変更不可能なので、そのために、故意にommittedにします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top