変化辞書の値が間違った使用時KVOとNSOperationQueue?
-
26-09-2019 - |
質問
働いていた例を通して、並行処理の章の"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対応)この変化辞書の見からマッピング NSKeyValueChangeKindKey
へ NSKeyValueChangeInsertion
, とともに、マッピングから 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
.また、 newValue
や oldValue
いように配列そのものではなく、項目追加されます。
そのアイデア?よろしく!
解決
ドキュメントは-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にします。