私のアプリのユーザーはフィルターを選択してアイテムを絞り込むことができます。フィルターが選択されると、NSNotification
選択されたフィルター ( ) の配列NSString
を別のビュー コントローラーに渡す が送信されます。
通知を受け取ったら、から配列を抽出でき[notification userInfo]
ます。ここでやりたいことは、新しいフィルターをユーザー用に既に保存されているフィルターと比較して、それらが異なる場合にのみサーバーを呼び出すことです。これが私の方法です:
- (void)applyFilters:(NSNotification *)notification {
NSArray *filters = [[notification userInfo] objectForKey:@"filters"];
if (showMyItems) {
if (![[NSSet setWithArray:filters] isEqualToSet:[NSSet setWithArray:[[PFUser currentUser] objectForKey:@"filtersMy"]]]) {
[[PFUser currentUser] setObject:[NSArray arrayWithArray:filters] forKey:@"filtersMy"];
[[PFUser currentUser] saveInBackground];
}
} else {
if (![[NSSet setWithArray:filters] isEqualToSet:[NSSet setWithArray:[[PFUser currentUser] objectForKey:@"filters"]]]) {
[[PFUser currentUser] setObject:[NSArray arrayWithArray:filters] forKey:@"filters"];
[[PFUser currentUser] saveInBackground];
}
}
}
オブジェクト/文字列の順序は重要ではないため、ここではNSSet
s ではなくs を比較しています。NSArray
私がやろうとしているのは、新しい配列を作成し、arrayWithArray:
. そのため、次にユーザーがフィルターの選択を変更したときに、新しいfilters
配列がユーザー用に保存されたものとは異なることが予想されます (私の if ステートメントの条件)。ただし、両方 (新しい配列と保存/フェッチされた配列) を NSLog すると、それらはまったく同じです! したがって、if 条件は決して通過しません。
これについての私の唯一の説明は、何らかの形でまだ配列[NSArray arrayWithArray:filters]
を指しているということです。filters
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:filters]]
SO と Appleの提案を試してみましたが、結果は同じです。
誰かが私の問題を見つけてもらえますか? 私は選択肢とアイデアが不足しています...
更新:
完全なメソッド (上記) を貼り付けました。もう少し背景:
- 同じ
UIViewController
クラスの 2 つのインスタンスを使用しています - あるインスタンスで
showMyItems
は、に設定されます (そのため、ステートメントYES
の上部のみが呼び出されます)。if
別のインスタンスでは -NO
、したがって、下部のみが呼び出されます - 興味深いの
showMyItems
はNO
、私のコードが期待どおりに動作することです! しかし、showMyItems
がYES
の場合、そうではありません... コードは同じですが。
何かご意見は?