0

NSFetchedResultControllerでコアデータを使用しています。この場合、ユーザーグループ数はnで、ユーザーは特定のグループを選択するか、all groupを選択することができます。手動でAll groupタイトル、static IDと関連コンテンツをデータベースに追加しました。iOSのカスタムソート、Coredataの上にデフォルト(全グループ)のタイトルを表示したい

NSFetchRequest <IRSUserAssetGroup *> *fetchRequest = [NSFetchRequest fetchRequestWithEntityName: [IRSUserAssetGroup entityName]]; 

NSSortDescriptor *nameSortDescriptor = [NSSortDescriptor sortDescriptorWithKey: NSStringFromSelector(@selector(assetGroupName)) 
                    ascending: YES 
                     selector: @selector(localizedCaseInsensitiveCompare:)]; 

[fetchRequest setSortDescriptors: @[nameSortDescriptor]]; 

[fetchRequest setFetchBatchSize: 4]; 

NSManagedObjectContext *mainContext = [[IRSCoreDataManager sharedManager] managedObjectContext]; 

NSFetchedResultsController <IRSUserAssetGroup *> *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest 
                               managedObjectContext: mainContext 
                                sectionNameKeyPath: nil 
                                  cacheName: nil]; 

NSError *fetchError = nil; 

if (![fetchedResultsController performFetch: &fetchError]) 
    FCALog(@"fetch error: %@", fetchError); 

[self setUserAssetGroupFetchedResultsController: fetchedResultsController]; 

これは私のFRCコードです。私は名前で並べ替えを使用しています。グループ名の中には数字で始まるものもあります。このため、All groupは最初の場所には配置されません。

可能ですか?All groupいつもトップソートになりますか?

エクストラ:@[@1, @5, @"text", @"aaaaaaa", @"All group"]:私は、検索オプション

例でテーブルビューを使用しています。ここではAll groupが常にリストの上に表示されます。どのように私はそれを並べ替えることができます。

出力:@[@"All group", @1, @5, @"aaaaaaa", @"text"]

+0

データモデルでこれを解決しないでください。ただし、静的セルを手動でTableViewDataSourceに追加してください。したがって、インデックス0のオブジェクトは 'All groups'セルです。' FetchedresultsController'からアイテムを取得するときにインデックスから1を引いてください。 – rckoenes

+0

ありがとうございます。今、私は並べ替えの種類だけを働いています。あなたは@jonRoseの答えについてどう思いますか?どのグループが効率的かスピードなのかなど、どれも良いです。 – user3589771

+0

前に言及したように、 'All group'には静的' ID'があります。これで 'NSPredicate * allGroupPredicate = [NSPredicate predicateWithFormat:@"%K!= %d "、NSStringFromSelector(@selector(assetGroupID))、allUserGroupID];"これを使用します。 On 'cellForRowAtIndexPath'' All group'の静的セル設定を行います。それはあなたが伝えようとしているものですか? – user3589771

答えて

0

あなたと私たちは言葉を読み、理解しているため「すべてのグループ」は特別ですが、コア・データは、「すべてのグループが」特別であることを知る方法がないことを知っています。すべてそれはそれが "A"で始まると見る。エンティティisAllGroupに別のプロパティを追加し、それを最初に並べ替え、次にassetGroupNameで並べ替えることができます。

"groupOrder"というプロパティを持つことができます。これは、 "すべてのグループ"では0、他のすべてのグループでは100です。これにより、新しいプロパティを作成することなく、他の特別なグループの注文を行う余地が増えます。

もっと一般的なアプローチは、assetGroupNameForSortというプロパティを追加し、表示専用のassetGroupNameの代わりに並べ替えることです。ほとんどのグループでは値は同じですが、「すべてのグループ」では「__Allグループ」などです。これは、あなたが期待しない方法でソートされた異なる言語の名前で発生する可能性のある修正の問題にも使用できます。

私は最初のアプローチをお勧めします。ちょうど 'isAllGroup'プロパティを追加してください。それは最も簡単で、データは容易に理解できます。

また、マイナーな問題 - fetchedResultsControllerはFetchBatchSizeを尊重しないため、削除することができます。

+0

マイナーな問題を指摘してくれてありがとう。なぜ説明できますか? 'FetchBatchSize'はフェッチ結果の一部でもあるので、' NSFetchRequest'を意味します。 – user3589771

+0

このマイナーチェンジのためにデータベースを更新(またはバージョン管理)したくありません。ですから、別のAND述語 'NSPredicate * allGroupPredicate = [NSPredicate predicateWithFormat:@"%K!=%d "、NSStringFromSelector(@selector(assetGroupID))、allUserGroupID];を追加します。 On 'cellForRowAtIndexPath'' All group'の静的セル設定を行います。もう一度ソートするオプションがありがとう。fetchedResultsControllerがbatchSizeを尊重している場合は – user3589771

+0

となります。これは、appleがbatchSizeを考慮して書き込んでいないためです。私は彼らがコードに複雑さを増やすので、これをしたと思います。たとえば、挿入があった場合は、削除も発生します(batchSizeを超えたためです)。 –

関連する問題