4

NSSortDescriptorで任意のソートを行う方法を頭で囲むことはできません。NSSortDescriptorで任意の並べ替えを使用する

私はこのような何かをしたい:

NSArray *sortAlgorithm = [NSArray arrayWithObjects:@"@", @"#", @"!", @"&", @"r", @"a", nil]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" 
                   ascending:YES 
                   comparator: 
    ^(id obj1, id obj2) { 
     NSComparisonResult comparisonResult; 
     //Some code that uses sortAlgorithm. 
     return comparisonResult; 
    } 
]; 

@から始まる任意のキーように、これはキーnameでオブジェクトを並べ替えるだろう、例えば@homeは、rで始まる任意のキーの前に来ます。 radicalであり、それはaで始まる任意のキーの前に来るでしょう。 anything

上記は単なる例です。ポイントは、完全に任意のソートを可能にすることです。

これは、NSFetchedResultsControllerに使用されます。

のコードは何ですか// sortAlgorithmを使用しているコードはいくつかありますか?

EDIT:PRとして、sortDescriptorを実装する私の試みを取り巻く

コード。 occulus'提案:

- (NSFetchedResultsController *)fetchedResultsController { 
    if (__fetchedResultsController) 
     return __fetchedResultsController; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    fetchRequest.entity = [NSEntityDescription entityForName:@"Tag" inManagedObjectContext:self.temporaryManagedObjectContext]; 

    //NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO comparator:^(id obj1, id obj2) { 

     NSArray *sortAlgorithm = [NSArray arrayWithObjects:@"#", @"!", @"@", @".", nil]; 

     NSString *obj1FirstChar = [(NSString *)obj1 substringToIndex:1]; 
     NSString *obj2FirstChar = [(NSString *)obj2 substringToIndex:1]; 
     int idx1 = [sortAlgorithm indexOfObject:obj1FirstChar]; 
     int idx2 = [sortAlgorithm indexOfObject:obj2FirstChar]; 

     if (idx1 < idx2) 
      return NSOrderedAscending; 
     else if (idx1 > idx2) 
      return NSOrderedDescending; 
     else 
      return NSOrderedSame; 
    }]; 

    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
    fetchRequest.fetchBatchSize = 20;   

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.temporaryManagedObjectContext sectionNameKeyPath:nil cacheName:@"Tags"]; 

    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    [self.fetchedResultsController performFetch:nil]; 

    return __fetchedResultsController; 
} 

コメントアウトsortDescriptor作品。

エンティティ "タグ"のオブジェクトには、確かにnameというプロパティがあります。しかし、そうでない場合でも、それは問題ではないようです。 Xcodeはそのコード行(sortDescriptor)をコンパイルしているようではないようですが、それはばかげて聞こえます。ブレークポイントは正常に動作していますが、その特定のコード行を破ることはありません。

+1

最近同じ問題が発生しました。私は最後にDon's * theory *を購入しました:http://stackoverflow.com/questions/4789782/nsfetchedresultscontroller-custom-sort-notgetting-called#comment5314586_4795667 –

答えて

3

NSStringsとしてobj1obj2の文字列の最初の文字を引き出し、任意の順序配列でインデックスを見つけて位置を比較する必要があります。 (あなたの^ブロックにこのコードを置く)

テストされていない
NSString *obj1FirstChar = [(NSString *)obj1 substringToIndex:1]; 
NSString *obj2FirstChar = [(NSString *)obj2 substringToIndex:1]; 
int idx1 = [sortAlgorithm indexOfObject:obj1FirstChar]; 
int idx2 = [sortAlgorithm indexOfObject:obj2FirstChar]; 

// NOTE: we haven't dealt with the case where one of the 
// chars wasn't found in the array of characters. A strategy 
// for this would need to be decided. 

if (idx1 == idx2) { 
    return NSOrderedSame; 
} 
if (idx1 < idx2) { 
    return NSOrderedAscending; 
} 
return NSOrderedDescending; 

、少し調整が必要になる場合があります。このような

何か。大文字/小文字の違いに注意してください。

UPDATE:カスタムソートディスクリプタとSQLバックアップコアデータストアの使用に問題があるようです。詳細はthis questionをご覧ください。

+0

私はあなたの提案を実装しました。テストのために私はソースをsortAlgorithm配列にある文字を含めます。そして、絶対に何も起こりません。私が期待する以上に何もない:私はNSSortDescriptorの定義にブレークポイントを設定し、決してブレークしません。前または後の命令でブレークポイントを設定すると、ブレークポイントが破損します。 Xcodeはシンプルであり、あなたのソリューションをテストしようとする私の試みをスキップしています...私はこの新しい問題を解決する上でこのコメントを投稿していましたが、これは他の人に知られています。 –

+0

私は上記のアルゴリズムが正しいと信じています。あなたが注意しているように、それが使用されたり呼び出されたりすることに問題があるかもしれません。 – occulus

+0

実際にソートをどのように要求しているかのコードを投稿できますか? NSSortDescriptorを使用する場所を指定します。ソート記述子が決して使用されていないように思えます。あなたのオブジェクトには「名前」とNSString *型のプロパティがありますか? – occulus

関連する問題