3

配列の内容に基づく NSPredicate または NSSortDescriptor (コア データ検索) を構築したいと考えています。

配列はuserId:s正しい順序で構成されます。

[1, 2, 5, 3];

NSFetchedResultsController の結果を同じ順序で提示したいと思います。

私もそうでしょう:

  1. 適切なユーザーを取得します (私はこれを行いました)
  2. sで並べ替えられた配列に基づいて、ユーザーのリストを並べ替えますuserId

これは可能ですか、どうすればできますか?

4

2 に答える 2

3

それは不可能だと思います。フェッチ リクエストの結果の並べ替え (SQLite ベースのストアの場合) は SQLite レベルで行われ、データベースに保存されている永続的な属性のみを使用できます。ソート記述子は、Objective-C 関数または変数を使用できません。

だからどちらか

  • 意図した順序を記述する追加の属性をエンティティに追加する (可能な場合)、または
  • 結果を取得した後、必要に応じて結果を並べ替えます (つまり、取得した結果コントローラーを自動変更追跡に使用することはできなくなります)。おそらく、ここで説明されている方法を使用できます: https://stackoverflow.com/a/15618277/1187415
于 2013-03-31T14:03:15.947 に答える
0

上記の答えは正確には当てはまりません。やりたいことはできますが、少し複雑です。

  1. NSNumber でカテゴリを作成します (userID は数字ですよね?)
  2. + objc_setAssoc を使用して、NSArray 型のグローバル変数をカテゴリに配置します。

    @interface NSNumber(MyExtension)
    
    + (NSArray *) orderingArray;
    + (void) setOrderingArray: (NSArray *)array;
    
    - (NSComparisonResult) myOwnCompareMethodUsingArray:(NSNumber *)theOtherNumber;
    
    @end
    
    int keyVar = 0;
    
    @implementation NSNumber(MyExtension)
    
    + (NSArray *) orderingArray
    {
     return objc_getAssociatedObject(self, &keyVal);
    }
    + (void) setOrderingArray: (NSArray *)array
    {
        objc_setAssociatedObject(self, &keyVal, array, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSComparisonResult) myOwnCompareMethodUsingArray:(NSNumber *)theOtherNumber;
    {
     NSArray *a = [self.class orderingArray];
     if(!a) return NSOrderedSame;
     return [@([a indexOfObject:self]) compare: @([a indexOfObject:theOtherNumber])];
    } 
    
  3. 配列をどこかに設定します。

    [NSNumber setOrderingArray:myArrayWithKeys]; 
    
  4. タイプのソート記述子を使用:

    [NSSortDescriptor sortDescriptorWithKey:@"userId" ascending:YES selector @selector(myOwnCompareMethodUsingArray:)]
    

これは、localizedCaseInsensitiveCompare を使用した文字列に対して機能するため、明らかに機能します。ただし、クエリが十分に大きく、fetchLimit/fetchOffset の最適化を無効にすると、クエリのパフォーマンスが低下します。操作しているフィールドは一意である必要があることを忘れないでください。そうしないと、すべてが地獄に落ちます。

于 2014-10-09T09:13:12.207 に答える