1

という名前の NSMutableSet プロパティを持つ単純なビュー コントローラーがありますselectedEmails。でviewDidLoad空のセットを作成し、変更をサブスクライブします。

self.selectedEmails = [NSMutableSet set];
[RACObserve(self, selectedEmails) subscribeNext:^(id emails) {
  NSLog(@"set: %@", emails);
}];

次に、デバッグのために、アイテムを のセットに追加しますviewDidAppear:。ただし、サブスクリプション ブロックは最初の空のセットに対して 1 回だけ起動し、新しく更新されたセットに対しては起動しません。

どうしてこれなの?変更を観察できるように修正するにはどうすればよいですか? 別の質問への回答で、セットを観察することはできず、それを含むクラスのみを観察できることがわかりました。これは、ReactiveCocoa がセットで機能しないことを意味しますか?

4

1 に答える 1

1

selectedEmails へのポインターを観察しているため、通知を受け取っていないと思いますが、ReactiveCocoa に関する限り、この値は変更されていません。その場所に含まれる情報は変更されています (つまり、オブジェクトが変更されています) が、ポインター自体はまだ同じオブジェクトを参照しています。

あなたがやろうとしていることに対する「プラグアンドプレイ」ソリューションはありません。リンクした回答と上記のコメントで提案された方法に加えて、変更可能なセットを使用する代わりに、通常のセットを使用して、いつでも新しいオブジェクトを作成する、より穴居人のスタイルのアプローチを使用することもできます。セットを変更します。

これは面倒なアプローチであり、人的ミスが非常に発生しやすいことに注意してください。

@property NSSet* selectedEmails;

// Create it
self.selectedEmails = [NSSet set];

// Add to it
self.selectedEmails = [self.selectedEmails setByAddingObject:someObject];

// Remove from it
NSMutableSet* mutableCopy = [self.selectedEmails mutableCopy]:
[mutableCopy removeObject:someObject];
self.selectedEmails = mutableCopy;
于 2014-04-16T22:41:53.073 に答える